본문 바로가기
알고리즘/백준

[14502] 연구소 Javascript

by SeungYn 2023. 4. 1.

https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

옛날에 책 보고 풀던시절 몇 번을 풀어도 이해가 안갔는데 지금은 풀린다 답지랑 풀이가 비슷하다 이코테 책으로 풀어서

 

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