백준

[백준 / JAVA] 2468. 안전 영역

baefrica 2023. 8. 17. 19:18
반응형

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

 

2468번: 안전 영역

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

www.acmicpc.net

 


💻 풀이 결과

💯 최종 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Node {
	int r, c;

	Node(int r, int c) {
		this.r = r;
		this.c = c;
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int[][] board = new int[N][N];

		int max = 1;
		int min = 100;
		int ans = 0;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				board[i][j] = sc.nextInt();

				max = Math.max(max, board[i][j]);
				min = Math.min(min, board[i][j]);
			}
		}

		Queue<Node> queue = new LinkedList<>();
		int[] dr = { 0, 0, -1, 1 };
		int[] dc = { -1, 1, 0, 0 };

		// 틀린이유 : (최솟값 - 1) 부터 (최댓값 + 1) 까지
		for (int h = min - 1; h <= max + 1; h++) {
			boolean[][] visited = new boolean[N][N];
			int cnt = 0; // 안전영역 갯수

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					// 방문하지 않았고 안 잠긴 시작점 찾으면
					if (board[i][j] > h && !visited[i][j]) {
						cnt++;
						queue.add(new Node(i, j));
						visited[i][j] = true;

						while (!queue.isEmpty()) {
							Node curr = queue.poll();

							// 4방 탐색
							for (int d = 0; d < 4; d++) {
								int nr = curr.r + dr[d];
								int nc = curr.c + dc[d];

								// 기저조건
								if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
									continue;
								}
								if (visited[nr][nc]) {
									continue;
								}
								if (board[nr][nc] <= h) {
									continue;
								}

								queue.add(new Node(nr, nc));
								visited[nr][nc] = true;
							} // 4방 탐색 끝
						} // while문 끝
					}
				}
			} // 2차원배열 탐색 끝

			ans = Math.max(ans, cnt);
		}

		// 물에 잠기지 않는 안전한 영역의 최대 개수를 출력
		System.out.println(ans);
	}
}

💢 틀린 이유

  • 높이의 범위를 잘못 설정하였다.
  • 전체 영역의 각 높이 중에서 (최솟값 - 1, 최댓값 + 1) 범위를 이용해야 했다.

💬 풀이 과정

  • (최솟값 - 1, 최댓값 + 1) 범위 중에서 각각의 방문 배열을 생성한다.
  • 각 h에 해당하는 안전영역의 개수를 BFS를 돌리면서 구한다.

💡 깨달은 점

1. BFS의 범위 설정 주의하기

  • BFS를 돌릴 때는 범위를 설정하는 것에 유의해야 한다.
반응형