https://www.acmicpc.net/problem/14502
옛날에 책 보고 풀던시절 몇 번을 풀어도 이해가 안갔는데 지금은 풀린다 답지랑 풀이가 비슷하다 이코테 책으로 풀어서
zeroSum, reduce 함수는 그냥 따로 써봤다. 한번 직접 사용해 볼겸 0의 갯수를 세는 거는 아무렇게나 해도 됨
원본 코드
const fs = require('fs');
const PATH =
process.platform === 'linux' ? '/dev/stdin' : './baekjon/input.txt';
const input = fs.readFileSync(PATH).toString().trim().split('\n');
const [n, m] = input[0].split(' ').map(Number);
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
const map = input.slice(1).map((str) => str.split(' ').map(Number));
let result = 0;
dfs(0);
console.log(result);
function dfs(count) {
if (count === 3) {
const res = virusMapResult(map);
result = Math.max(res, result);
return;
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (map[i][j] === 0) {
map[i][j] = 1;
dfs(count + 1);
map[i][j] = 0;
}
}
}
}
function virusMapResult(map) {
const copyMap = map.map((list) => [...list]);
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (copyMap[i][j] === 2) virusDfs(i, j, copyMap);
}
}
return reduce(zeroSum, 0, copyMap);
}
function virusDfs(x, y, copyMap) {
copyMap[x][y] = 2;
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 >= m) continue;
if (copyMap[nx][ny] === 0) virusDfs(nx, ny, copyMap);
}
}
function zeroSum(prev, list) {
return prev + list.reduce((p, c) => (c === 0 ? p + 1 : p), 0);
}
function reduce(f, acc, iter) {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const a of iter) {
acc = f(acc, a);
}
return acc;
}
'알고리즘 > 백준' 카테고리의 다른 글
[11509] 풍선 맞추기 Javascript (0) | 2023.04.13 |
---|---|
[10026] 적록색약 javascript (0) | 2023.04.01 |