알고리즘

[java] 백준 2468 : 안전영역

_DAMI 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인것만 탐색하여 안전 영역의 수를 탐색할 수 있게 된다.