[프로그래머스][JAVA] 안전지대

Boknami·2023년 8월 2일

프로그래머스

목록 보기
13/29

문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 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;
    }
}

0개의 댓글