코딩테스트

[백준/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());

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