Algorithm/백준

[백준] 2140: 지뢰찾기(JavaScript)

코딩너굴 2022. 10. 12. 22:38
728x90

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

 

2140번: 지뢰찾기

지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는

www.acmicpc.net

문제

지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는지에 대한 정보가 주어진다. 게이머는 게임을 진행하면서 보드의 칸을 하나씩 열게 된다. 만약 그 칸에 지뢰가 있다면 게임이 끝나고, 없는 경우에는 그 칸에 적혀있는 숫자, 즉 그 칸과 인접해 있는 8개의 칸들 중 몇 개의 칸에 지뢰가 있는지를 알 수 있게 된다.

이 문제는 보드의 테두리가 모두 열려있고, 그 외는 모두 닫혀있는 상태에서 시작한다. 예를 들어 다음과 같은 경우를 보자.

1 1 1 0 0
2 # # # 1
3 # # # 1
2 # # # 1
1 2 2 1 0

#는 닫혀있는 칸을 나타낸다. 이러한 보드가 주어졌을 때, 닫혀있는 칸들 중 최대 몇 개의 칸에 지뢰가 묻혀있는지 알아내는 프로그램을 작성하시오. 위의 예와 같은 경우에는 다음과 같이 6개의 지뢰가 묻혀있을 수 있다.

1 1 1 0 0
2 *     1
3 * * * 1
2 * *   1
1 2 2 1 0

입력

첫째 줄에 N(1≤N≤100)이 주어진다. 다음 N개의 줄에는 N개의 문자가 공백 없이 주어지는데, 이는 게임 보드를 의미한다.

출력

첫째 줄에 묻혀있을 수 있는 지뢰의 최대 개수를 출력한다.

예제 입력 1 

5
11100
2###1
3###1
2###1
12210

예제 출력 1 

6

풀이

1. 0이 하나라도 있는가?

8방향중 0이 있으면 지뢰를 둘 수 없다.

2. 만약 지뢰를 뒀으면 지뢰기준 8방향 수들을 1씩 빼준다.

추후에 지뢰가 추가로 설치될 수 있음

 

전체 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = fs.readFileSync(filePath).toString().split("\n");

const N = parseInt(input.shift());
const dist = [
  [1, 0],
  [0, 1],
  [-1, 0],
  [0, -1],
  [1, 1],
  [1, -1],
  [-1, 1],
  [-1, -1],
];

const getMap = () => {
  const arr = [];
  input.forEach((v) => arr.push(v.split("").slice(0, N)));
  return arr;
};

const solution = () => {
  if (N <= 2) {
    console.log(0);
    return;
  }
  const map = getMap();
  let cnt = (N - 2) * (N - 2);

  for (let i = 1; i < N - 1; i++) {
    for (let j = 1; j < N - 1; j++) {
      let isZero = false;
      for (let d = 0; d < 8; d++) {
        const nx = i + dist[d][0];
        const ny = j + dist[d][1];
        if (parseInt(map[nx][ny]) === 0) {
          cnt--;
          isZero = true;
          break;
        }
      }
      if (!isZero) {
        dist.forEach(([dx, dy]) => {
          const nx = i + dx;
          const ny = j + dy;
          if (map[nx][ny] !== "#") map[nx][ny] -= 1;
        });
      }
    }
  }
  console.log(cnt);
};

solution();
728x90