문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
board는 n * n 배열입니다.
1 ≤ n ≤ 100
지뢰는 1로 표시되어 있습니다.
board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
풀이
function solution(board) {
for(let y = 0; y < board.length; y ++){
for(let x = 0; x < board[y].length; x++){
if(board[y][x] === 1){
board[y][x] = 'x';
}
}
}
for(let y = 0; y < board.length; y ++){
for(let x = 0; x < board[y].length; x++){
if(typeof(board[y][x]) === 'string'){
if(y > 0){
if(typeof(board[y-1][x]) === 'number') board[y-1][x] += 1;
if(x > 0) if(typeof(board[y-1][x-1]) === 'number') board[y-1][x-1] += 1;
if(x < board[y].length - 1) if(typeof(board[y-1][x+1]) === 'number') board[y-1][x+1] += 1;
}
if(y < board[y].length - 1){
if(typeof(board[y+1][x]) === 'number') board[y+1][x] += 1;
if(x > 0) if(typeof(board[y+1][x-1]) === 'number') board[y+1][x-1] += 1;
if(x < board[y].length - 1) if(typeof(board[y+1][x+1]) === 'number') board[y+1][x+1] += 1;
}
if(x > 0) if(typeof(board[y][x-1]) === 'number') board[y][x-1] += 1;
if(x < board[y].length - 1) if(typeof(board[y][x+1]) === 'number') board[y][x+1] += 1;
}
}
}
return board.flat().filter(el => el === 0).length;
}
우선 for문을 중첩하여 2차원 배열을 순회했는데,
기존에 사용하던 변수인 i와 j보단 가독성을 위해 x와 y로 사용했다.
모든 배열의 원소를 순환하며 기존에 1인 원소를 문자열 x로 치환해 주었다.
이후, 다시 배열을 순환하며 원소가 문자열인 것들에 대해서만,
y가 0보다 클 경우 ( 위쪽으로 이동이 가능한 경우 )
[y-1][x] ( 위로 1칸 )에 +1일 해주고,
다음으로 x가 좌우로 이동할 수 있는지를 체크 한 뒤 각각 좌상, 우상에 +1을 해주었다.
이때 원소의 타입이 숫자인 경우에만 +1을 해주었다 ( 제한 조건을 안 주면 x1, x11, x111, 이런 식으로 문자열이 길어지므로 )
마찬가지로 y가 board [y]의 개수 -1개 보다 작을 때 아래로 한 칸, 좌하, 우하 쪽에 +1을 해주었다.
이후 별개로 좌, 우 방향도 체크해 숫자를 더해주었다.
이렇게 하면 board 배열에 x인 것과, 안전지대가 아닌 쪽은 1 또는 2, 그 이상의 숫자로 채워지고
안전지대인 곳은 0이 그대로 남아있게 된다.
board배열을 flat 메서드를 이용해 펼쳐준 뒤,
0의 개수를 리턴해주었다.