본문 바로가기
알고리즘/백준 문제풀이

백준 [자바 java] 2468번 : 안전거리

by 잔디🌿 2022. 8. 2.

    쉬운 문제이긴 했지만 문제를 이해하기가 쫌 어려웠어요ㅜ 다른 분 블로그 보고 이해를 했습니다. 위, 아래, 오른쪽 혹은 왼쪽이라고 해서 위아래는 있어야 하고 왼쪽 오른쪽이 옵션 같은 것인 줄 알았는데 한마디로 잠기지 않는 땅의 덩어리 개수를 구하라는 이야기입니다. 

    import java.io.*;
    import java.util.*;
    
    
    
    class Main {
    	static int[][] vis;
    	static int n;
    	
    	
    	static void check( int i, int j, int dd) {
    		if(i-1>=1&&vis[i-1][j] == 0) {
    			vis[i-1][j] = dd;
    			check(i-1,j,dd);
    		}
    		if(i+1<=n&&vis[i+1][j] == 0) {
    			vis[i+1][j] = dd;
    			check(i+1,j,dd);
    		}
    		if(j-1>=1&&vis[i][j-1] == 0) {
    			vis[i][j-1] = dd;
    			check(i,j-1,dd);
    		}
    		if(j+1<=n&&vis[i][j+1] == 0) {
    			vis[i][j+1] = dd;
    			check(i,j+1,dd);
    		}
    	}
    	
    	
    	public static void main(String[] arg) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
    		StringTokenizer st;
    		
    		
    		n = Integer.parseInt(br.readLine());
    		
    		int[][] arr = new  int[n+1][n+1];
    		vis = new  int[n+1][n+1];
    		int cnt = 0;
    		int max1 = 0;
    		
    		int i; 
    		int j;
    		for(i = 1;i<=n;i++) {
    			st = new StringTokenizer(br.readLine());
    			
    			for(j = 1;j<=n;j++) {
    				arr[i][j] = Integer.parseInt(st.nextToken());
    				max1 = Math.max(max1,arr[i][j]);
    			}
    		}
    		
    		int k;
    	    int dd;
    	    int max = 1;
    	    
    		for(i = 0;i<=max1;i++) {
    			dd = 2;
    			
    			cnt = 0;
    			
    			for(j = 1;j<=n;j++) {
    				for(k = 1;k<=n;k++) {//잠기는 구역
    				    if(arr[j][k] <=i) {
    				    	vis[j][k] = 1;
    				    }
    				    else {
    				    	vis[j][k] = 0;
    				    }
    				    
    				}	
    			}
    			
    			for(j = 1;j<=n;j++) {
    				for(k = 1;k<=n;k++) {
    				    if(vis[j][k] == 0) {
    				    	
    				    	
    				    	vis[j][k] = dd;
    				    	check(j,k,dd);
    				    	dd++;
    				    	
    				    }
    				}	
    			}
    			
    			max = Math.max(max, dd);
    			
    		}
    		
    		System.out.println(max-2);
    		
    }
    
    }

    처음에 arr에 입력 받고, 0부터 arr의 최댓값까지 차례로 비가 온다고 가정했을 때의 덩어리 중 가장 큰 수를 출력하도록 했어요. vis에 0을 저장했다가 비가 와서 잠기는 땅은 1을 넣어주었고, 다시 vis [1][1]부터 잠기지 않은 땅은 check 함수를 호출해 같은 덩어리인 땅에는 같은 수가 들어가게 설계했습니다.

     

    실수 1. vis이 들어갈 자리에 arr이 들어가게 했다.

    실수 2. 마지막에 max 에서 2를 뺀 값을 넣어야 하는데 1을 뺀 값을 넣었다.

     

    기억할 점: 어떤 배열을 써야 할 지 주의하기.

     

    다른 사람의 코드와 다른 점 : 딱히 없다.