-
[백준] 2140: 지뢰찾기(JavaScript)Algorithm/백준 2022. 10. 12. 22:38728x90
https://www.acmicpc.net/problem/2140
문제
지뢰찾기는 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'Algorithm > 백준' 카테고리의 다른 글
[백준]2116: 주사위 쌓기(JavaScript) (0) 2022.10.10 [백준]7570: 줄 세우기(JavaScript) (0) 2022.09.06 [백준]3020: 개똥벌레(javascript) (0) 2022.09.02 [백준] 3980: 선발 명단(javascript) (0) 2022.09.02 [백준]17136: 색종이 붙이기(javascript) (0) 2022.09.01