본문 바로가기
CODING/BAEKJOON

[BAEKJOON] 2468번 안전 영역

by snow_white 2022. 5. 26.


높이가 1인 지역부터 최대 높이까지 잠기지 않는 안전 영역의 최대 갯수를 구하는 문제이다.

잠기지 않는 영역은 어떻게 구할까?

전체 구역을 돌면서 잠기지 않는 영역의 지점을 찾으면 BFS/DFS로 해당 지역을 방문처리 하면 된다.

 

1. 높이가 1일 때부터 최대 높이까지 반복

2. 전체 구역을 돌면서 안전 구역을 발견하면 BFS 탐색 시작

3. 해당 높이에서의 BFS 호출 횟수만큼 cnt++

4. 해당 높이에서의 탐색 종료되면 최대 cnt 값 출력

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {

	static int n, max=-1, cnt, m_cnt=-1;
	static int arr[][];
	static boolean visited[][];
	static int dx[] = {-1,1,0,0};
	static int dy[] = {0,0,1,-1};
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		arr = new int[n][n];
		String str[];
		for(int i=0; i<n; i++) {
			str = br.readLine().split(" ");
			for(int j=0; j<n; j++) {
				arr[i][j] = Integer.parseInt(str[j]);
				max = (max<arr[i][j])?arr[i][j]:max;
			}
		}
		for(int ct=1; ct<=max; ct++) {
			// 1층 이하, 2층 이하, ...
			cnt=0;
			visited = new boolean[n][n];
			for(int i=0; i<n; i++) {
				for(int j=0; j<n; j++) {
					if(arr[i][j]>=ct && !visited[i][j]) { // 타겟층 이상일 때 bfs 수행
						bfs(i,j, ct);
						cnt++;
					}
				}
				m_cnt = (m_cnt<cnt)?cnt:m_cnt;
			}
		}
		System.out.println(m_cnt);
	}
	public static void bfs(int i, int j, int h) {
		Queue<Point> queue = new LinkedList<Point>();
		queue.add(new Point(i,j));
		visited[i][j] = true;
		
		while(!queue.isEmpty()) {
			Point q = queue.poll();
			int n_x = q.x;
			int n_y = q.y;
			for(int k=0; k<4; k++) {
				int nx = n_x +dx[k];
				int ny = n_y +dy[k];
				if(nx>=0 && nx<n && ny>=0 && ny<n && !visited[nx][ny] && arr[nx][ny]>=h) {
					visited[nx][ny] = true;
					queue.add(new Point(nx, ny));
				}
			}
		}
	}
	static class Point{
		int x,y;
		public Point(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
}

[출처]

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

 

2468번: 안전 영역

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

www.acmicpc.net

 

'CODING > BAEKJOON' 카테고리의 다른 글

[BAEKJOON] 스위치 켜고 끄기  (0) 2022.08.02
[BAEKJOON] 연구소  (0) 2022.07.21
[BAEKJOON] 2579번 계단 오르기  (0) 2022.04.24
[BAEKJOON] 2805번 나무 자르기  (0) 2022.04.02
[BAEKJOON] 1920번 수 찾기  (0) 2022.03.30

댓글