ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/javascript] 1303 전투
    코딩테스트 2023. 2. 27. 16:24
    const fs = require("fs");
    const filepath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
    let stdin = fs.readFileSync(filepath).toString();
    const input = stdin.split("\n").map((v) => v.split(" "));
    
    // // 첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다.
    // 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다.
    // 모든 자리에는 병사가 한 명 있다. B는 파란색, W는 흰색이다. 당신의 병사와 적국의 병사는 한 명 이상 존재한다.
    // N명이 뭉쳐있을때느 N^2의 위력!
    // 대각선으로만 뭉친 병사는 뭉쳐있지 않은것임.
    
    const [a, ...b] = input;
    const [N, M] = a.map(Number);
    const map = b.map((el) => el[0].split(""));
    // WBWWW
    // WWWWW
    // BBBBB
    // BBBWW
    // WWWWW
    
    const visited = {};
    const score = { scoreW: [], scoreB: [] };
    
    function solution() {
      for (let i = 0; i < M; i++) {
        for (let j = 0; j < N; j++) {
          if (!visited[[i, j]]) {
            bfs(i, j);
          }
        }
      }
      return [
        score.scoreW.map((el) => Math.pow(el, 2)).reduce((prev, cur) => prev + cur),
        score.scoreB.map((el) => Math.pow(el, 2)).reduce((prev, cur) => prev + cur),
      ];
    }
    
    function bfs(y, x) {
      const dy = [-1, 1, 0, 0];
      const dx = [0, 0, -1, 1];
      let current = [y, x];
      let queue = [[y, x]];
      visited[[y, x]] = true;
      let currentArr;
      if (map[y][x] === "W") {
        currentArr = score.scoreW;
      } else currentArr = score.scoreB;
      currentArr.push(1);
      while (queue.length) {
        //얘가 돌면서 확인해주는 애임....
        current = queue.shift();
        for (let i = 0; i < 4; i++) {
          let ny = current[0] + dy[i];
          let nx = current[1] + dx[i];
          if (
            ny >= 0 &&
            nx >= 0 &&
            ny < M &&
            nx < N &&
            !visited[[ny, nx]] &&
            map[ny][nx] === map[current[0]][current[1]]
          ) {
            queue.push([ny, nx]);
            visited[[ny, nx]] = true;
            currentArr[currentArr.length - 1]++;
          }
        }
      }
      return score;
    }
    //bfs 이용해서 한칸씩 이동함. 같은 팀일경우에만 이동함.
    // 이동하면서 추가함. 이미 방문했으면 추가 x.
    // W , B 배열 각각 만들어서 추가함.
    
    console.log(...solution());

    좀 더 런타임시간을 줄여보고자 갖은 노력을 하였으나... 줄어들지 않았다... 왜...?ㅠㅠ

Designed by Tistory.