알고리즘/백준 문제풀이

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

잔디🌿 2022. 8. 2. 19:31

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

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을 뺀 값을 넣었다.

 

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

 

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