-
[java] 백준 2468 : 안전영역알고리즘 2023. 5. 17. 20:21
문제
https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
package main; import java.io.*; import java.util.*; public class Main { static boolean[][] visited; static int[][] arr; static int[] dx = {0,0,1,-1}; static int[] dy = {1,-1,0,0}; static int n; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); arr = new int[n][n]; int maxHeight = 0; for(int i=0; i<n; i++) { st = new StringTokenizer(br.readLine()); for(int j=0; j<n; j++) { arr[i][j]=Integer.parseInt(st.nextToken()); maxHeight = Math.max(maxHeight, arr[i][j]); } } //안전영역 최댓값 탐색 int max=0; for(int k=0; k< maxHeight+1; k++) { int cnt=0; visited = new boolean[n][n]; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(visited[i][j]==false && arr[i][j]> k) { cnt++; DFS(i,j,k); } } } max = Math.max(max, cnt); } System.out.println(max); } //안전지대 탐색 static void DFS(int x, int y, int height) { 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<n && ny<n) { if(visited[nx][ny]==false && arr[nx][ny]> height) { DFS(nx,ny,height); } } } } }
visited가 되지 않고 height보다 큰 값이면
cnt(즉 안전영역 수)를 증가시키고 dfs로 height 보다 큰 값만 visited 한다. 그러면 안전영역만 visited 되어 다음 for문에서 visted==false인것만 탐색하여 안전 영역의 수를 탐색할 수 있게 된다.
'알고리즘' 카테고리의 다른 글
<문자열> 프로그래머스 lv.1 숫자 문자열과 영단어 (0) 2023.05.27 [java] 백준 9205 : 맥주 마시면서 걸어가기 (1) 2023.05.24 [java] 백준 5014 : 스타트링크 (0) 2023.05.16 [java] 백준 1920 : 수 찾기 (0) 2023.05.16 [java] 백준 1463 : 1로 만들기 (0) 2023.05.04