백준 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);
}
}
}
}
Author And Source
이 문제에 관하여(백준 2468번 안전 영역(JAVA)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@alstjdwo1601/백준-2468번-안전-영역JAVA저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)