
function solution(board) {
// 좌표상에서 위 아래 좌 우 대각선 확인을 위한 배열.
// dx는 x축, dy는 y축
// 아래 배열을 x,y쌍으로 묶어서 표현하면 [1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]
// 2차원 좌표상에 나타내면 중심을 제외한 모든 방향에 점이 찍히는 형태로 표현됨
const dx = [1, 0, -1, 0, 1, 1, -1, -1];
const dy = [0, 1, 0, -1, 1, -1, 1, -1];
// 배열의 길이를 표현
const n = board.length;
let answer = n * n; // 초기 안전지대를 모든 칸으로 초기화
const ch = []; // 지뢰가 있는 곳을 체크하는 배열
// 모든 칸을 확인
for(let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if(board[i][j] === 1) {
// 지뢰를 발견하면 ch 배열에 지뢰의 위치를 push
ch.push([i, j]);
answer--; // 안전지대를 한 칸 빼줍니다. (지뢰가 있는 위치는 확정적으로 안전지대가 아니기 때문에)
}
}
}
// 모든 지역이 지뢰 밭일 경우
if (answer === 0) return 0;
// 지뢰 위치 확인
ch.forEach((w) => {
// w는 [0, 0] 이런 꼴로 지뢰가 있는 위치를 나타냄
// 위, 아래, 좌우, 대각선 8 곳의 위치 확인 (k < 8)
for(let k = 0; k < 8; k++) {
// nx, ny는 지뢰가 있는 위치를 기준으로 팔방을 확인하는것
const nx = w[0] + dx[k]; // x축 위치
const ny = w[1] + dy[k]; // y축 위치
// nx ny의 위치가 board의 안쪽이고 (nx >= 0 && ny >= 0 && nx < n && ny < n)
// 이미 확인한 위험지역이나 지뢰의 위치가 아니라면 (board[nx][ny] === 0) *board[nx][ny] === 1 이 의미하는것은 해당 위치는 이미 위험지역으로 설정했다는 의미 + 지뢰가 있는 위치
if(nx >= 0 && ny >= 0 && nx < n && ny < n && board[nx][ny] === 0) {
board[nx][ny] = 1; // 위험 지대로 설정
answer--; // 안전지대 카운팅 - 1
}
}
})
return answer;
}
제 두뇌로는 도저히 안되겠어서 다음 블로그를 보고 답을 제출했습니다.