[백준] 2140: 지뢰찾기(JavaScript)
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();