[구름톤 챌린지] 9일차 미션 폭탄 구현하기 (2) - JavaScript

문제 출처

구름톤 챌린지

문제 설명

N x N 크기의 정사각형 모양의 땅이 있다. 땅을 1 x 1 크기의 작은 땅으로 나누었을 때, 위에서 y번째, 왼쪽에서 x번째에 위치한 땅의 좌표를 (y, x)로 나타낸다. 추가로 모든 땅에는 폭탄 값이라고 하는 값이 있다. 모든 폭탄 값의 초기 값은 0이다.

K개의 폭탄을 이 땅 위에 떨어트리려고 한다. 어떤 1 x 1 크기의 땅 위에 폭탄을 떨어트리게 되면 폭판이 떨어진 땅과, 그 땅에 상하좌우로 인접한 칸의 폭탄 값에 영향을 끼친다. 폭탄값이 변하는 정도는 땅의 상태에 따라 다르다.

  • 땅의 상태가 # 이라면 폭탄 값은 변하지 않는다.
  • 땅의 상태가 0 이라면 폭탄 값은 1 증가한다.
  • 땅의 상태가 @ 이라면 폭탄 값은 2 증가한다.

모든 폭탄을 떨어트린 뒤에, 모든 땅의 폭탄 값 중에서 가장 높은 값을 출력해보자.

제한 조건
  • 첫째 줄에 땅의 한 변의 길이 N과 폭탄을 떨어트릴 횟수 K가 공백을 두고 주어진다.
  • 다음 N개의 줄에는 땅의 상태를 나타내는 N개의 문자가 공백을 두고 주어진다.
  • 다음 K개의 줄에는 폭탄을 떨어트릴 좌표를 나타내는 y, x가 공백을 두고 주어진다.
예시

입력 예
4 4
0 0 @ 0
0 0 0 0
0 # 0 0
0 0 0 0
2 2
2 3
1 4
1 4

출력 예
4

풀이
const readline = require("readline");
let rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
let input = [];
rl.on("line", (line) => {
  input.push(line);
});

rl.on("close", () => {
  // N, K를 가져온다.
  const [N, K] = input[0].split(" ").map(Number);

  // 땅의 상태를 가져온다.
  const board = input.slice(1, N + 1).map((b) => b.split(" "));

  // 폭탄을 떨어트릴 좌표를 가져온다. (0부터 시작하므로 -1을 해준다.)
  const bomb = input
    .slice(N + 1)
    .map((b) => b.split(" ").map((n) => Number(n) - 1));

  // 폭탄이 떨어지면서 영향을 끼치는 땅의 상태를 체크할 배열을 만든다. (board와 같은 크기로 만든다.)
  const check = Array.from({ length: N }, () => Array(N).fill(0));

  // 폭탄이 떨어지면서 영향을 끼치는 땅의 좌표 (현위치 + 상하좌우)
  const xy = [
    [0, 0],
    [0, 1],
    [1, 0],
    [0, -1],
    [-1, 0],
  ];

  // 폭탄을 떨어트린다.
  bomb.forEach((b) => {
    // 폭탄이 떨어지는 좌표
    const [r, c] = b;

    // 폭탄이 떨어지는 좌표의 현위치와 상하좌우를 체크한다.
    xy.forEach((m) => {
      const dx = r + m[0];
      const dy = c + m[1];

      // 땅의 범위를 벗어나지 않고, 땅의 상태가 #이 아닐 경우
      if (dx >= 0 && dx < N && dy >= 0 && dy < N && board[dx][dy] !== "#") {
        // 땅의 상태에 따라 check 배열에 값을 더해준다.
        if (board[dx][dy] === "0") check[dx][dy] += 1;
        if (board[dx][dy] === "@") check[dx][dy] += 2;
      }
    });
  });

  // check 배열에서 가장 큰 값을 출력한다.
  console.log(Math.max(...check.flat()));
});
정리

현재 구름톤 챌린지가 진행중인데 하루에 한 문제를 풀면서 머리를 굴려보아요.

피드백은 언제나 환영입니다. 😊

사용한 메서드

split() 메서드 - MDN
slice() 메서드 - MDN
map() 메서드 - MDN
flat() 메서드 - MDN
filter() 메서드 - MDN
forEach() 메서드 - MDN
구조 분해 할당 - MDN