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 ) 일 때 세가지의 경우로 나눠 풀었다.
//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
//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
//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 , 즉 비안전지대 일 때의 개수를 카운트 한다
다음 기회에...
그림 그려가며 풀었다 ㅋㅋㅋ