문제 설명 :
제한사항
board는 n * n 배열입니다.
1 ≤ n ≤ 100
지뢰는 1로 표시되어 있습니다.
board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
board | result |
---|---|
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] | 16 |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] | 13 |
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] | 0 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
function solution(board) {
// 전체 칸 수
const n = board.length;
// baord를 손상시키지 않기 위해 복사
const danger = JSON.parse(JSON.stringify(board));;
// 8 방향 탐색을 위한 좌표 설계 ↙, ↓, ↘, ←, →, ↖, ↑, ↗
const dx = [-1, -1, -1, 0, 0, 1, 1, 1];
const dy = [-1, 0, 1, -1, 1, -1, 0, 1];
for (let i = 0; i < n; i++) {
for (let c = 0; c < n; c++) {
// 만약 지뢰가 없다면 pass
// 지뢰가 있다면 지뢰 위치를 기준으로 8 방향을 1로 변환
if(board[i][c] === 0) continue;
for (let b = 0; b < 8; b++){
let cx = i + dx[b];
let cy = c + dy[b];
// [-1, -1]와 같이 나오면 지대를 벗어난 것이기 때문에 지대를 벗어나지 않는 조건 걸어주기
// 그리고 중복 작업 방지를 위해 수정하지 않은 곳으로만 범위 지정해주기
if (cx >= 0 && cx < n && cy >= 0 && cy < n && danger[cx][cy] === 0) {
danger[cx][cy] = 1;
}
}
}
}
// 0은 false로 쓰일 수 있다는 점을 활용해 danger에서 false인 0는 반환되지 않고 true인 1만 반환되도록 함
// 1의 길이를 측정해 위험 지역의 총 개수 구하고,
// 전체 지역에서 뺴주어 안전지역의 칸 수 구하기
return n*n - (danger.flat().filter(a => a).length);
}