풀이방법은 2가지가 있다고 생각한다.
첫 째, 0으로 채워진 새로운 이중배열(newBoard)을 만들고, board(이중배열)을 순회하면서 지뢰(1)를 찾으면 상하좌우대각에 1을 채운뒤, newBoard를 순회하며 0의 개수를 count하여 리턴.
둘 째, 지뢰(1)로부터의 상하좌우대각에 대한 상대위치 배열을 미리 정의한 후, board를 순회하며 해당 위치가 상하좌우대각에서 볼 때 지뢰가 없으면 count하여 리턴.
function solution(board) {
// 지뢰 상하좌우대각에 해당하는 외곽을 모두 정의
let outside = [
[-1, 0],
[-1, -1],
[-1, 1],
[0, -1],
[0, 1],
[1, 0],
[1, -1],
[1, 1],
];
let safezone = 0;
board.forEach((row, y, self) =>
row.forEach((it, x) => {
if (it === 1) return false;
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
? false
: safezone++;
})
);
return safezone;
}
첫 번째 방법으로 먼저 코딩해서 문제를 푼 뒤, 어떻게 리팩토링하면 좋을 지 다른 분 풀이를 참고했을 때 별도의 newBoard를 만들어 새로 채워넣을 필요없이 가장 깔끔하게 문제를 풀 수 있는 방법이라 기록하기 위해 포스팅을 남긴다.