코딩테스트
[백준/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());
좀 더 런타임시간을 줄여보고자 갖은 노력을 하였으나... 줄어들지 않았다... 왜...?ㅠㅠ