본문 바로가기

PS

[BOJ] 2468번: 안전 영역

https://www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

 

 

알고리즘 분류: DFS, BFS

 

더보기
public class Main {
	static Myscanner sc = new Myscanner();
	static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
	static int safe[][],N,max,height;
	static boolean[][] visited = new boolean[N][N];
	public static void main(String[] args) {
		N = sc.nextInt();
		safe = new int[N][N];
		visited = new boolean[N][N]; 
		max =0;
		for(int r =0; r<N;r++)
		{
			for(int c =0 ;c<N;c++)
			{
				safe[r][c]=sc.nextInt();
				max = Math.max(max, safe[r][c]);
			}
		}

		int ans =1;
		for(height =1;height<=max;height++)
		{
			int cnt =0;

			for(int r = 0; r<N;r++)
			{
				for(int c =0; c<N;c++)
				{
					if(safe[r][c]>height && !visited[r][c]){
						cnt++;
						DFS(r,c);
					}
				}
			}
			ans = Math.max(ans, cnt);
			for(int i =0; i<N;i++){
				Arrays.fill(visited[i], false);
			}

		}
		out.println(ans);
        out.close();

	}
	private static void DFS(int r, int c) {

		if(r<0 || c<0 || r>=N || c>=N || safe[r][c]<=height || visited[r][c]) return;
		visited[r][c]=true;

		DFS(r-1,c);
		DFS(r+1,c);
		DFS(r,c-1);
		DFS(r,c+1);		

	}
}

 

DFS로 문제 풀이를 하였다.

 

1. 배열의 값을 초기화할 때 최대 높이(max)를 구해놓는다.

2. height (1 <=h <=max)까지 기준점을 잡고 dfs를 통해 안전 영역이 몇 개인지 구한다.

3. ans =1  (기본적으로 h=1이면 모든 지역이 안전 영역이 되기 때문에)로 초기화한 후 ans와 cnt의 max값을 비교하여 값을 지정한다.

4. visited 배열이 static 이기 때문에 false 값으로 초기화해준다.

'PS' 카테고리의 다른 글

[BOJ] 9517번 : 아이 러브 크로아티아  (0) 2017.06.13
[BOJ] 1987번 : 알파벳  (0) 2017.06.10
[BOJ] 2583번: 영역 구하기  (0) 2017.06.08
[BOJ] 11049번: 행렬 곱셈 순서  (0) 2017.06.08
[BOJ] 2667번: 단지번호붙이기(DFS)  (0) 2017.06.07