https://www.acmicpc.net/problem/10026
나는 같은 색이면 dfs를 수행하고 적록색이면 한 번 더 dfs를 수행하는 방식으로 풀었다.
코드
const fs = require('fs');
const PATH =
process.platform === 'linux' ? '/dev/stdin' : './baekjon/input.txt';
const input = fs.readFileSync(PATH).toString().trim().split('\n');
let [n, ...map] = input;
let colorCnt = 0;
let colorWeakness = 0;
let visited = Array.from({ length: n }, () => new Array(n).fill(false));
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
for (let i = 0; i < +n; i++) {
for (let j = 0; j < +n; j++) {
if (!visited[i][j]) {
dfs(i, j, map[i][j]);
colorCnt++;
}
}
}
visited = Array.from({ length: n }, () => new Array(n).fill(false));
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (!visited[i][j]) {
dfs(i, j, map[i][j], true);
colorWeakness++;
}
}
}
console.log(colorCnt, colorWeakness);
function dfs(x, y, color, isWeakNess = false) {
if (visited[x][y]) return;
visited[x][y] = true;
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if (color === map[nx][ny]) {
dfs(nx, ny, color, isWeakNess);
}
if (
isWeakNess &&
(color === 'R' || color === 'G') &&
(map[nx][ny] === 'R' || map[nx][ny] === 'G')
) {
dfs(nx, ny, color, isWeakNess);
}
}
}
하지만 답지에서는 좀더 깔끔하게 했는데 그냥 적색일 때는 G 문자를 R로 바꿔줬다.
코드
const fs = require('fs');
const PATH =
process.platform === 'linux' ? '/dev/stdin' : './baekjon/input.txt';
const input = fs.readFileSync(PATH).toString().trim().split('\n');
let [n, ...map] = input;
let colorCnt = 0;
let colorWeakness = 0;
let visited = Array.from({ length: n }, () => new Array(n).fill(false));
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
for (let i = 0; i < +n; i++) {
for (let j = 0; j < +n; j++) {
if (!visited[i][j]) {
dfs(i, j, map[i][j]);
colorCnt++;
}
}
}
visited = Array.from({ length: n }, () => new Array(n).fill(false));
map = map.map((str) => str.replace(/G/g, 'R'));
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (!visited[i][j]) {
dfs(i, j, map[i][j]);
colorWeakness++;
}
}
}
console.log(colorCnt, colorWeakness);
function dfs(x, y, color) {
if (visited[x][y]) return;
visited[x][y] = true;
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if (color === map[nx][ny]) {
dfs(nx, ny, color);
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[11509] 풍선 맞추기 Javascript (0) | 2023.04.13 |
---|---|
[14502] 연구소 Javascript (0) | 2023.04.01 |