[풀이 방식]
비가와서 잠기는 깊이 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);
}
}
}
}