문제설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
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
풀이
2차원 배열을 일단 보기 좋은 형태로 나열.
[
[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]
]
위험 지역으로 처리 되어야 할 지점은
board[i][j]가 1인 지점의 주변 8지점이고,
8지점의 위치는
board[i-1][j-1], board[i-1][j] ,board[i-1][j+1] (위 세 지점)
board[i][j-1], 지뢰 board[i][j+1] (수평 두 지점)
board[i+1][j-1], board[i+1][j], board[i+1][j+1] (아래 세 지점)
위험지역은 위 인덱스 값을 대입하여 요소 값을 2로 변경해 주면 되는데,
변경조건은
1. 배열을 벗어나면 안되고,
2. 위험이역으로 지정된 자리에 지뢰가 위험지역으로 변경되면 안된다.
이것을 쉽게 처리 하기위해 index i와 j에 더해줄 값들을 배열(arrI,arrJ)로 미리 지정하고,
반복문을 통해 대입해주었다.
배열의 범위를 벗아났을 때 발생하는 예외는 try-catch문으로 처리하고, catch문에서,
continue로 반복문이 계속 진행되게 했다.
지뢰가 없는 경우에만( board[i+arrI[k]][j+arrJ[k]]!=1 ), 위험지역으로 변경해주었다.
다시 반복문을 돌려 안전지역(0)의 개수를 answer로 집계했다.
class Solution {
public int solution(int[][] board) {
int answer = 0;
int[] arrI = {-1,-1,-1,0,0,1,1,1};
int[] arrJ = {-1,0,1,-1,1,-1,0,1};
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] == 1) {
for (int k = 0; k < arrJ.length; k++) {
try {
if(board[i+arrI[k]][j+arrJ[k]]!=1) {
board[i+arrI[k]][j+arrJ[k]] = 2;
}
} catch (Exception e) {
continue;
}
}
}
}
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] == 0) {
answer++;
}
}
}
return answer;
}
}
참고