프로그래머스 : 안전지대

Digeut·2024년 4월 21일
0

프로그래머스

목록 보기
164/164

❔문제설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

💡코드풀이

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int[][] newBoard = new int[board.length][board[0].length];
        
        //지뢰 위치 찾기
        for(int i = 0 ; i < board.length ; i++){
            for(int j = 0 ; j < board[0].length ; j++){
                if(board[i][j] == 1){
                    dangerZone(i,j,newBoard);
                }
            }
        }
        
        answer = countZero(newBoard);
        
        return answer;
    }
    
    private void dangerZone(int a, int b, int[][] newBoard){
        //상, 하, 좌, 우, 대각선 이동위치 좌표
       int[] dx = {0,1,-1,0,-1,1,1,-1};
       int[] dy = {1,0,0,-1,-1,1,-1,1};
        
        newBoard[a][b] = 1;
        for(int i = 0 ; i < dx.length ; i++){
            int newX = a + dx[i];
            int newY = b + dy[i];
            
             if (newX >= 0 && newX < newBoard.length 
                 && newY >= 0 && newY < newBoard[0].length) {
                newBoard[newX][newY] = 1;
            }
        }
    }
    
    private int countZero(int[][] newBoard){
        int count = 0;
        
         for(int i=0 ; i< newBoard.length; i++){
            for(int j=0 ; j< newBoard[i].length; j++){
                if(newBoard[i][j]==0){
                        count++;
                 }            
            }
        }
        return count;
    }
}

⭐고찰

정말 오랜 시간동안 풀지못해서 헤맨 문제다
상 하 좌 우 대각선에 해당하는 위치를 1로 바꾼다음 0인 부분을 count하면 되는 '간단한'문제라고 하는데 2차원 배열의 개념은 항상 머리에 떠오르지 않는다. 다른 사람들의 풀이를 보니 지뢰가 있는 위치로부터 주변 8개의 위치를 2로 바꾼다음 (1로 바꾸게 되면 모든 배열의 위치가 지뢰밭이 될수 있단다) 나머지를 세는 방법도 있던데 나는 dx, dy의 개념부터 헤맸기때문에 최대한 한줄한줄 내가 이해가 되는 방향으로 board와 같은 크기를 가지는 배열을 만들어서 지뢰가 위치한 기점을 중심으로 주위부분을 1로 바꾸고 1이 아닌 곳을 세는 방식으로 진행했다.

profile
개발자가 될 거야!

0개의 댓글