안전지대

김세호·2022년 12월 7일
0

내 풀이(비효율적)

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        // 지뢰로 인한 비안전지대와 안전지대로 표시 해 줄 배열 zero[][] 를 board의 크기와 같게 만들어 줬다.
        //(배열의 각 원소 값은 안전지대 = 0 , 비안전지대 = 1)
        int[][] zero = new int[board.length][board[0].length];
        //1x1       
        if((board.length==1)&&(board[0][0]==1)){
            answer = 0;
        }else if((board.length==1)&&(board[0][0]!=1)){
            answer = 1;
        }
        //2x2
        if((board.length==2)){
            answer =4;
            for(int i = 0 ; i < board.length ; i++){
                for(int j = 0 ; j <board[0].length ; j++ ){
                    if((board[i][j]==1)){
                        answer = 0;
                    }
                }
            }        
        }
        //nxn (n>=3)
        if((board.length>=3)){
            //배열의 상하좌우 각 모서리에 지뢰가 있는 경우
                //좌상 모서리에 지뢰 있는 경우
                if(board[0][0]==1){
                        zero[0][0]=1;
                        zero[0][1]=1;
                        zero[1][0]=1;
                        zero[1][1]=1;
                    }
                //우상 모서리에 지뢰 있는 경우
                if(board[0][board.length-1]==1){
                        zero[0][board.length-1]=1;
                        zero[0][board.length-2]=1;
                        zero[1][board.length-2]=1;
                        zero[1][board.length-1]=1;
                }
                //좌하 모서리에 지뢰 있는 경우
                if(board[board.length-1][0]==1){
                        zero[board.length-1][0]=1;
                        zero[board.length-2][0]=1;
                        zero[board.length-1][1]=1;
                        zero[board.length-2][1]=1;
                }
                //좌우 모서리에 지뢰 있는 경우
                if(board[board.length-1][board.length-1]==1){
                        zero[board.length-1][board.length-1]=1;
                        zero[board.length-2][board.length-1]=1;
                        zero[board.length-1][board.length-2]=1;
                        zero[board.length-2][board.length-2]=1;
                }
            //배열의 각 모서리를 제외한 상 하 좌 우 변에 지뢰가 있는 경우
                //배열의 상 변에 지뢰가 있는 경우
                for(int j =1 ; j<=board.length-2;j++){
                    if(board[0][j]==1){
                        zero[0][j-1]=1;
                        zero[0][j]=1;
                        zero[0][j+1]=1;
                        zero[1][j-1]=1;
                        zero[1][j]=1;
                        zero[1][j+1]=1;
                    }
                }
                //배열의 하 변에 지뢰가 있는 경우
                for(int j =1 ; j<=board.length-2;j++){
                    if(board[board.length-1][j]==1){
                        zero[board.length-1][j-1]=1;
                        zero[board.length-1][j]=1;
                        zero[board.length-1][j+1]=1;
                        zero[board.length-2][j-1]=1;
                        zero[board.length-2][j]=1;
                        zero[board.length-2][j+1]=1;
                    }
                }
                //배열의 좌 변에 지뢰가 있는 경우
                for(int i =1 ; i<=board.length-2;i++){
                    if(board[i][0]==1){
                        zero[i-1][0]=1;
                        zero[i][0]=1;
                        zero[i+1][0]=1;
                        zero[i-1][1]=1;
                        zero[i][1]=1;
                        zero[i+1][1]=1;
                    }
                }
                //배열의 우 변에 지뢰가 있는 경우
                for(int i =1 ; i<=board.length-2;i++){
                    if(board[i][board.length-1]==1){
                        zero[i-1][board.length-1]=1;
                        zero[i][board.length-1]=1;
                        zero[i+1][board.length-1]=1;
                        zero[i-1][board.length-2]=1;
                        zero[i][board.length-2]=1;
                        zero[i+1][board.length-2]=1;
                    }
                }
        //그 외의 경우
        for(int i = 1 ; i < board.length-1 ; i++){
            for(int j = 1 ; j <board[0].length-1 ; j++ ){
                if(board[i][j]==1){
                    zero[i-1][j-1]=1;
                    zero[i-1][j]=1;
                    zero[i-1][j+1]=1;
                    zero[i][j-1]=1;
                    zero[i][j]=1;
                    zero[i][j+1]=1;
                    zero[i+1][j-1]=1;
                    zero[i+1][j]=1;
                    zero[i+1][j+1]=1;
                }                 
            }
            System.out.println();
        }
        for(int i = 0 ; i < board.length ; i++){
            for(int j = 0 ; j <board[0].length ; j++ ){
                System.out.print(zero[i][j]);
                if(zero[i][j]==0){
                    ++answer;
                }
            }
            System.out.println();
        }
        }         
        return answer;
    }
}

풀이방법

2차원 배열 board (n x n , 1 ≤ n ≤ 100) 의 크기 1 x 1, 2 x 2, n x n ( 3 ≤ n ) 일 때 세가지의 경우로 나눠 풀었다.

1 x 1 일 때

//1x1       
        if((board.length==1)&&(board[0][0]==1)){
            answer = 0;
        }else if((board.length==1)&&(board[0][0]!=1)){
            answer = 1;
        }
  • 1x1 배열에선 폭탄이 놓이면 안전지대가 없어지므로 (board[0][0]==1) 일 때 answer = 0, (board[0][0]!=1) 일 때 answer =1

2 x 2 일 때

//2x2
        if((board.length==2)){
            answer =4;
            for(int i = 0 ; i < board.length ; i++){
                for(int j = 0 ; j <board[0].length ; j++ ){
                    if((board[i][j]==1)){
                        answer = 0;
                    }
                }
            }        
        }
  • 2x2 배열에서도 1x1배열과 마찬가지로 폭탄이 어디든 하나라도 놓이면 안전지대가 없어지므로 board[i][j]==1 일 때 answer = 0, 폭탄이 놓여있지 않으면 모든 곳이 안전지대 이므로 answer = 4

n x n ( 3 ≤ n )일 때

//nxn (n>=3)
        if((board.length>=3)){
            //배열의 상하좌우 각 모서리에 지뢰가 있는 경우(빨간색 영역)
                //좌상 모서리에 지뢰 있는 경우
                if(board[0][0]==1){
                        zero[0][0]=1;
                        zero[0][1]=1;
                        zero[1][0]=1;
                        zero[1][1]=1;
                    }
                //우상 모서리에 지뢰 있는 경우
                if(board[0][board.length-1]==1){
                        zero[0][board.length-1]=1;
                        zero[0][board.length-2]=1;
                        zero[1][board.length-2]=1;
                        zero[1][board.length-1]=1;
                }
                //좌하 모서리에 지뢰 있는 경우
                if(board[board.length-1][0]==1){
                        zero[board.length-1][0]=1;
                        zero[board.length-2][0]=1;
                        zero[board.length-1][1]=1;
                        zero[board.length-2][1]=1;
                }
                //우하 모서리에 지뢰 있는 경우
                if(board[board.length-1][board.length-1]==1){
                        zero[board.length-1][board.length-1]=1;
                        zero[board.length-2][board.length-1]=1;
                        zero[board.length-1][board.length-2]=1;
                        zero[board.length-2][board.length-2]=1;
                }
            //배열의 각 모서리를 제외한 상 하 좌 우 변에 지뢰가 있는 경우 (파란색 영역)
                //배열의 상 변에 지뢰가 있는 경우
                for(int j =1 ; j<=board.length-2;j++){
                    if(board[0][j]==1){
                        zero[0][j-1]=1;
                        zero[0][j]=1;
                        zero[0][j+1]=1;
                        zero[1][j-1]=1;
                        zero[1][j]=1;
                        zero[1][j+1]=1;
                    }
                }
                //배열의 하 변에 지뢰가 있는 경우
                for(int j =1 ; j<=board.length-2;j++){
                    if(board[board.length-1][j]==1){
                        zero[board.length-1][j-1]=1;
                        zero[board.length-1][j]=1;
                        zero[board.length-1][j+1]=1;
                        zero[board.length-2][j-1]=1;
                        zero[board.length-2][j]=1;
                        zero[board.length-2][j+1]=1;
                    }
                }
                //배열의 좌 변에 지뢰가 있는 경우
                for(int i =1 ; i<=board.length-2;i++){
                    if(board[i][0]==1){
                        zero[i-1][0]=1;
                        zero[i][0]=1;
                        zero[i+1][0]=1;
                        zero[i-1][1]=1;
                        zero[i][1]=1;
                        zero[i+1][1]=1;
                    }
                }
                //배열의 우 변에 지뢰가 있는 경우
                for(int i =1 ; i<=board.length-2;i++){
                    if(board[i][board.length-1]==1){
                        zero[i-1][board.length-1]=1;
                        zero[i][board.length-1]=1;
                        zero[i+1][board.length-1]=1;
                        zero[i-1][board.length-2]=1;
                        zero[i][board.length-2]=1;
                        zero[i+1][board.length-2]=1;
                    }
                }
        //그 외의 경우 (노란색 영역)
        for(int i = 1 ; i < board.length-1 ; i++){
            for(int j = 1 ; j <board[0].length-1 ; j++ ){
                if(board[i][j]==1){
                    zero[i-1][j-1]=1;
                    zero[i-1][j]=1;
                    zero[i-1][j+1]=1;
                    zero[i][j-1]=1;
                    zero[i][j]=1;
                    zero[i][j+1]=1;
                    zero[i+1][j-1]=1;
                    zero[i+1][j]=1;
                    zero[i+1][j+1]=1;
                }                 
            }
            System.out.println();
        }


위 영역(색깔)에 따라 폭탄이 놓일 때 비안전지대가 생기는 경우가 다르기 때문에 세가지의 경우의 수로 나눠 해결 했다.

  • 배열의 상하좌우 각 모서리에 지뢰가 있는 경우 (빨간색 영역, 비안전지대 4곳 생성)
  • 배열의 각 모서리를 제외한 상 하 좌 우 변에 지뢰가 있는 경우 (파란색 영역, 비안전지대 6곳 생성)
  • 그 외의 경우 (노란색 영역, 비안전지대 9곳 생성)

마무리

for(int i = 0 ; i < board.length ; i++){
            for(int j = 0 ; j <board[0].length ; j++ ){
                System.out.print(zero[i][j]);
                if(zero[i][j]==0){
                    ++answer;
                }
            }
            System.out.println();
        }

zero[i][j]==0 , 즉 비안전지대 일 때의 개수를 카운트 한다

다른 사람 풀이

다음 기회에...

여담


그림 그려가며 풀었다 ㅋㅋㅋ

0개의 댓글