티스토리 뷰

1. 문제

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

 

2. 코드

  • 입력받은 각 지역의 높이를 탐색하면서, 가장 낮은 지형과 가장 높은 지형의 값을 구한다.
    • smallRainValue, bigRainValue
  • smallRainValue부터 bigRainValue까지 반복문을 통해 비를 내리게 하고, 2차원 배열을 탐색하면서 안전 영역을 구하면 된다.
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;
    static int[][] arr;
    static int smallRainValue = 0; // 가장 적게 내린
    static int bigRainValue = Integer.MIN_VALUE; // 가장 많이 내린
    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {-1, 1, 0, 0};
    static int answer = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];

        for (int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");
            for (int j = 0; j < N; j++) {
                int value = Integer.parseInt(input[j]);
                arr[i][j] = value;
                smallRainValue = Math.min(smallRainValue, value);
                bigRainValue = Math.max(bigRainValue, value);
            }
        }

        for (int value = smallRainValue; value <= bigRainValue; value++) {
            boolean[][] visited = new boolean[N][N]; // 침수 : true
            init(visited, value);

            int count = 0; // 영역 개수
            for (int y = 0; y < N; y++) {
                for (int x = 0; x < N; x++) {
                    if (!visited[y][x]) {
                        bfs(visited, x, y);
                        count += 1;
                    }
                }
            }
            answer = Math.max(answer, count);
        }

        System.out.println(answer);
    }

    static void init(boolean[][] visited, int value) {
        for (int y = 0; y < N; y++) {
            for (int x = 0; x < N; x++) {
                if (arr[y][x] <= value) {
                    visited[y][x] = true; // 침수 처리
                }
            }
        }
    }

    static void bfs(boolean[][] visited, int x, int y) {
        Queue<int[]> que = new LinkedList<>();
        que.offer(new int[]{x, y});
        visited[y][x] = true;
        while (!que.isEmpty()) {
            int[] position = que.poll();
            for (int d = 0; d < 4; d++) {
                int cx = position[0] + dx[d];
                int cy = position[1] + dy[d];
                if (isNotOutOfRange(cx, cy) && !visited[cy][cx]) {
                    visited[cy][cx] = true;
                    que.offer(new int[]{cx, cy});
                }
            }
        }
    }

    static boolean isNotOutOfRange(int x, int y) {
        return x >= 0 && y >= 0 && x < N && y < N;
    }

}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30