programmers

[JAVA] 안전지대

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

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

풀이1) 중간 / 끝 / 모서리 나눠서 풀이

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        //중간부분
        for(int i=1; i<board.length-1;i++){
            for(int j=1; j<board[i].length-1; j++){
                if(board[i][j]==1){
                   for(int x=i-1;x<=i+1;x++){
                       for(int y=j-1;y<=j+1;y++){
                           if(board[x][y]!=1){
                               board[x][y]=2;
                           }
                       }
                   }
                }
            }
        }
        
        //모서리
        for(int i=1; i<board.length-1;i++){
            if(board[0][i]==1){
                 for(int x=i-1;x<=i+1;x++){
                    for(int y=0;y<=1;y++){
                           if(board[x][y]!=1){
                               board[x][y]=2;
                           }
                       }
                }
            }
            if(board[i][0]==1){
                for(int x=i-1;x<=i+1;x++){
                    for(int y=0;y<=1;y++){
                           if(board[x][y]!=1){
                               board[x][y]=2;
                           }
                       }
                }
            }
            if(board[board.length-1][i]==1){
                for(int x=board.length-2;x<=board.length-1;x++){
                    for(int y=i-1;y<=i+1;y++){
                           if(board[x][y]!=1){
                               board[x][y]=2;
                           }
                       }
                }
            }
                        if(board[i][board.length-1]==1){
                for(int x=i-1;x<=i+1;x++){
                    for(int y=board.length-2;y<=board.length-1;y++){
                           if(board[x][y]!=1){
                               board[x][y]=2;
                           }
                       }
                }
            }
        
        }
        //꼭지점
        if(board.length!=1){
        if(board[0][0]==1){
            for(int i=0; i<=1;i++){
                for(int j=0; j<=1;j++){
                    if(board[i][j]!=1){
                        board[i][j]=2;
                    }
                }		
            }
        }
        if(board[0][board.length-1]==1){
            for(int i=0; i<=1;i++){
                for(int j=board.length-2; j<=board.length-1;j++){
                    if(board[i][j]!=1){
                        board[i][j]=2;
                    }
                }		
            }
        }
        if(board[board.length-1][0]==1){
            for(int i=board.length-2; i<=board.length-1;i++){
                for(int j=0; j<=1;j++){
                    if(board[i][j]!=1){
                        board[i][j]=2;
                    }
                }		
            }
        }
        if(board[board.length-1][board.length-1]==1){
            for(int i=board.length-2; i<=board.length-1;i++){
                for(int j=board.length-2; j<=board.length-1;j++){
                    if(board[i][j]!=1){
                        board[i][j]=2;
                    }
                }		
            }
        }
        }
        for(int i=0; i<board.length;i++){
            for(int j=0; j<board[i].length; j++){
                if(board[i][j]==0) answer++;
            }
        }
        
        return answer;
    }
}

풀이2) 배열 2칸씩 늘린 배열에 복사하여 구하기

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int[][] temp = new int[board.length+2][board.length+2];
        
        for(int i=1; i<temp.length-1; i++){
            for(int j=1; j<temp.length-1;j++){
                temp[i][j]=board[i-1][j-1];
            }
        }
        
        
        //중간부분
        for(int i=1; i<temp.length-1;i++){
            for(int j=1; j<temp.length-1; j++){
                if(temp[i][j]==1){
                   for(int x=i-1;x<=i+1;x++){
                       for(int y=j-1;y<=j+1;y++){
                           if(temp[x][y]!=1){
                               temp[x][y]=2;
                           }
                       }
                   }
                }
            }
        }
      
        for(int i=1; i<temp.length-1;i++){
            for(int j=1; j<temp[i].length-1; j++){
                if(temp[i][j]==0) answer++;
            }
        }
        
        return answer;
    }
}