문제 풀이/Programmers

120866. 안전지대 자바

공부하고 기억하는 공간 2023. 8. 1. 01:03
728x90
반응형
SMALL

해당 문제를 풀기위한 가장 난관은 가장자리에 있는 폭탄은 어떻게 연산할것인가? 이다.

가장자리가 아닌 배열들은 2차배열값안에서 x축과 y축을 각각 x-1 , x , x+1 // y-1 , y , y-1을 폭탄의 범위로 구한후  나머지 0들의 개수를 계산하면 되지만 가장자리는 위와 같은 범위와 다르게 연산해야한다.

 

📌이때 가장 쉽게 해결 할 수 있는 방법은 원래 범위의 배열보다 상하좌우 전부 1칸씩 확장하는 것이다.

그럼 가장자리도 가운데에 있는 배열처럼 같은 알고리즘으로 해결할 수 있다.

이해하기 쉽게 아래 사진을 첨부해 두었다.

나는 폭탄의 주변을 2로 바꾸는 연산을 수행 후 0의 개수를 파악했다.

이떄 가장자리의 숫자들은 내가 확장한것으로 0이있더라고 세지 않는다.

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        
        int len = board.length+2;
	
        int[][] arr = new int[len][len];
        
        for(int i=0; i<board.length;i++) {
		for(int j=0; j<board[i].length; j++) {
			if(board[i][j]==1) arr[i+1][j+1]=1;
		}
	}
        
        for(int i=0; i<arr.length;i++) {
		for(int j=0 ; j<arr[i].length ; j++) {
			if(arr[i][j]==1) {
				for(int x = i-1; x<=i+1; x++) {
					for(int z= j-1; z<=j+1; z++) {
						if(arr[x][z]!=1) {
							arr[x][z] =2;
//							System.out.println("x :" + x + " z" + z);
						}
					}
				}
			}//if
		}
	}

    int cnt=0;
	for(int i=1; i<arr.length-1;i++) {
		for(int j=1; j<arr.length-1;j++) {
			if(arr[i][j]==0) cnt++; 
		}
	}
                
        return cnt;
    }
}

728x90
반응형
SMALL