문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
🕐 풀이 시간 : 45분 정도
예전에 이런 비슷한 문제를 푼 적이 있어서 어떻게 문제를 풀면 좋을 것인지에 대해서는 알고 있었다. 1을 발견할 경우에는 8방향으로 1을 만드는. 그래서 큰 의심없이 그대로 문제를 풀었지만 틀렸다..
그 원인은 원래 지뢰가 존재했던 위치만을 조사해야하지만 그것이 아니라 지뢰로 인해서 변해버린 곳까지 지뢰로 인식해버렸기 때문이었다.
일단 지뢰의 위치를 !미리! 모두 찾아놓아야한다.
그렇지 않으면 전제적으로 탐색을 하다가 지뢰로 인해 이미 변해버린 곳을 지뢰가 있는 것으로 간주해서 범위가 끊임없이 켜져버릴 수 있다.
그 후 지뢰의 위치를 담은 리스트에서 하나씩 지뢰의 위치를 꺼내서 dx,dy를 이용해 8방향을 전체적으로 1로 바꿔준다.8방향은 dx,dy에 각각 1을 더하고 빼서 실제 2차원 좌표에서 8방향을 이동하는 것처럼 사용한다.
이 후는 그냥 0의 개수를 세어주면 끝~!!!
int[] dx = {0,1,-1,0,-1,1,1,-1};
int[] dy = {1,0,0,-1,-1,1,-1,1};
for(int k = 0 ; k < 8; k++){
if(dx[k] + i >= 0 && dy[k] + j >= 0 && dx[k] + i <= board.length-1 && dy[k] + j <= board.length-1)
board[dx[k] + i][dy[k] + j] = 1;
}
class Solution {
public int solution(int[][] board) {
int answer = 0;
int test = 0;
int[] dx = {0,1,-1,0,-1,1,1,-1};
int[] dy = {1,0,0,-1,-1,1,-1,1};
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == 1){
for(int k = 0 ; k < 8; k++){
if(dx[k] + i >= 0 && dy[k] + j >= 0 && dx[k] + i <= board.length-1 && dy[k] + j <= board.length-1)
board[dx[k] + i][dy[k] + j] = 1;
}
}
}
}
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == 0) answer+=1;
}
}
return answer;
}
}
import java.util.*;
class Solution {
public int solution(int[][] board) {
ArrayList<int[]> list = new ArrayList<>();
int answer = 0;
int[] dx = {0,1,-1,0,-1,1,1,-1};
int[] dy = {1,0,0,-1,-1,1,-1,1};
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == 1){
int[] temp = {i,j};
list.add(temp);
}
}
}
for(int a = 0 ; a < list.size(); a++){
int i = list.get(a)[0];
int j = list.get(a)[1];
for(int k = 0 ; k < 8; k++){
if(dx[k] + i >= 0 && dy[k] + j >= 0 && dx[k] + i <= board.length-1 && dy[k] + j <= board.length-1)
board[dx[k] + i][dy[k] + j] = 1;
}
}
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == 0) answer+=1;
}
}
return answer;
}
}