코딩 테스트/백준

[Node.js] 16918_봄버맨

58청춘 2024. 7. 9. 18:22
728x90

문제

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

 

 

 

풀이

이 문제를 처음 봤을 때는 4가지 경우가 반복되는 문제라고 생각해 구현을 해봤다.하지만, 통과가 되지 않았으므로 매 시간마다 변화를 주는 방식으로 풀이했다.

 

문제 풀이는 흠... 그냥 간단한 BFS 문제이다.

 

4방향의 상태를 체크하며 폭탄이 폭발한다.

 

코드

const input = require('fs')
  .readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt')
  .toString().trim().split('\n').map(e => e.split(' '));

const [r, c, n] = input.shift().map(Number);
const map = input.map(el => el[0].trim().split(''));
const boom = Array.from({ length: r }, () => Array(c).fill(0));
const dir = [[-1, 0], [1, 0], [0, -1], [0, 1]];
let time = 1;

for (let i = 0; i < r; i++){
  for (let j = 0; j < c; j++){
    if (map[i][j] === 'O') boom[i][j] = 3;
  }
}

while (time <= n) {
  if (time % 2 === 0) {
    for (let i = 0; i < r; i++){
      for (let j = 0; j < c; j++){
        if (map[i][j] === '.') {
          map[i][j] = "O";
          boom[i][j] = time + 3;
        }
      }
    }
  }
  else {
    for (let i = 0; i < r; i++){
      for (let j = 0; j < c; j++){
        if (boom[i][j] === time) {
          map[i][j] = '.';

          for (let k = 0; k < 4; k++){
            const nx = i + dir[k][0];
            const ny = j + dir[k][1];
            if (nx >= 0 && nx < r && ny >= 0 && ny < c && map[nx][ny] === "O" && boom[nx][ny] !== time) {
              map[nx][ny] = '.';
              boom[nx][ny] = 0;
            }
          }
        }
      }
    }
  }
  time += 1;
}

console.log(map.reduce((acc, cur) => {
  return acc + cur.reduce((a, c) => a + c, "") + '\n';
}, ""))
728x90