연결요소별 w,b의 제곱값들의 합
상하좌우 dfs를 돌면서 w, b각각 카운팅
dfs에 파라미터로 cnt값을 넘겨주면서 return 받아 더하는 방법으로 구현
전역변수를 만들고 dfs돌때마다 w,s의 제곱수를 더해준 후 초기화해줌
DFS 파라미터
const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n')
const [m, n] = input[0].split(" ").map(Number);
const graph = [];
for (let i = 1; i <= n; i++) graph.push(input[i].split(""));
// console.log(graph);
const visited = Array.from({ length: n }, () => new Array(m).fill(false));
const dy = [-1, 1, 0, 0],
dx = [0, 0, -1, 1];
function dfs(y, x, team, cnt) {
visited[y][x] = true;
for (let i = 0; i < 4; i++) {
const ny = y + dy[i],
nx = x + dx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
if (!visited[ny][nx] && graph[ny][nx] === team) cnt = dfs(ny, nx, team, cnt + 1);
}
return cnt;
}
let ans1 = 0;
ans2 = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (visited[i][j]) continue;
graph[i][j] === "W"
? (ans1 += dfs(i, j, "W", 1) ** 2)
: (ans2 += dfs(i, j, "B", 1) ** 2);
}
}
console.log(ans1, ans2);
DFS 전역변수
const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n')
const [m, n] = input[0].split(" ").map(Number);
const graph = [];
for (let i = 1; i <= n; i++) graph.push(input[i].split(""));
// console.log(graph);
const visited = Array.from({ length: n }, () => new Array(m).fill(false));
let w = 1,
b = 1;
const dy = [-1, 1, 0, 0],
dx = [0, 0, -1, 1];
function dfs(y, x, team) {
visited[y][x] = true;
for (let i = 0; i < 4; i++) {
const ny = y + dy[i],
nx = x + dx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
if (!visited[ny][nx] && graph[ny][nx] === team) {
team === "W" ? w++ : b++;
dfs(ny, nx, team);
}
}
}
let ans1 = 0,
ans2 = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (visited[i][j]) continue;
if (graph[i][j] === "W") {
dfs(i, j, "W");
ans1 += w ** 2;
w = 1;
} else {
dfs(i, j, "B");
ans2 += b ** 2;
b = 1;
}
}
}
console.log(ans1, ans2);
시간은 또이또이 근데 파라미터가 더 좋아보임(초기화 과정이 없고, 코드가 간결하며 깔끔함)