백준 2468번 안전 영역(JAVA)


[풀이 방식]
비가와서 잠기는 깊이 depth 를 1씩 늘려가면서 depth보다 높은 즉, 안전영역에서 dfs를 호출한다. 여기서 주변에 인접하면서 아직 방문하지 않은 곳은 하나의 안전영역을 생성한다.
dfs의 호출 횟수가 곧 안전 영역의 갯수가 된다. 이 값을 리스트에 담고 최대값을 뽑았다.

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
	public static int [][] arr;
	public static boolean [][] visited;
	public static ArrayList<Integer> list;
	static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		int size = sc.nextInt();
		
		arr = new int[size][size];
		visited = new boolean[size][size];
		int max_inarr=0;
		for(int i = 0 ; i < size ; i ++) {
			for(int j = 0 ; j < size ; j++) {
				arr[i][j] =sc.nextInt();
				if(max_inarr < arr[i][j])
					max_inarr = arr[i][j];
			}
		}
		
		list = new ArrayList<>();
		
		
        
    
        for(int depth = 0 ; depth<= max_inarr ; depth++) {
        	int cnt = 0;
	        for(int i = 0 ; i < size ; i ++) {
	        	for(int j = 0 ; j < size ; j++) {
	        		if(arr[i][j] > depth && !visited[i][j]) {
	        			cnt++; //dfs 부를때마다 영역 수가 증가함
	        			dfs(i,j, depth);
	        			
	        		}
	        	}
	        }
	        for(boolean a[]: visited)
	        	Arrays.fill(a, false);
	        list.add(cnt);
        }
        
        int max = Collections.max(list);
		System.out.println(max);
	}	
	
	public static void dfs(int x, int y, int depth) {
		visited[x][y] = true;
		
		for(int i = 0 ; i < 4 ; i ++) {
    		int nx = x + dx[i];
    		int ny = y + dy[i];
    		
    		if(nx >= 0 && ny >= 0 && nx < arr.length && ny < arr.length) {
    			if(arr[nx][ny] > depth && !visited[nx][ny])
    				dfs(nx,ny, depth);
    		}
    	}
	}
}


좋은 웹페이지 즐겨찾기