본문 바로가기

CodingTEST

[백준 2468] 안전 영역 (JAVA)

반응형

백준 2468번 문제 - 안전 영역

 

2468번: 안전 영역

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

www.acmicpc.net


문제 분석

 

 

 

  • 지역 N * N 개의 높이를 배열 형태로 입력 받았을 때, 가장 많은 안전 영역 덩어리 개수를 출력해라.
    • 지역의 높이가 물이 잠긴 높이보다 클 경우 안전 영역
    • 안전 영역 덩어리 : 안전영역으로만 이루어진 덩어리 (이해를 쉽게 하기 위해 필자가 만든 용어)

 

해결 키 포인트

 

  • 지역이 잠긴 경우의 수를 다 했을 때 ! 가장 많은 덩어리 수를 알아내야하므로 모든 방법을 탐색해야함
    → BFS 사용
  • 가장 높은 지역 높이(max) 알아내기 : 빙산 높이까지 잠기는 경우의 수를 다 탐색해야 하므로 !
  • 지역이 물에 잠기는 높이가 0부터 max까지 반복하면서 덩어리 개수 알아내기
    • 처음 위치를 큐에 넣고, 반복하면서 하나의 덩어리 알아내기 (방문 기록 해야지 다시 확인 안함)
    • 덩어리 확인할 때마다 result++;
  • 모두 확인시 가장 큰 덩어리 개수 알아내 출력

 

코드

 

import java.io.*;
import java.util.*;

public class Main {
    public static int N;
    public static int [][] lists;
    public static boolean [][] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        int max = 0;

        lists = new int [N][N];
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                lists[i][j] = Integer.parseInt(st.nextToken());
                max = Math.max(lists[i][j], max);
            }
        }

        int result = 0;

        for (int m = 0; m <= max; m++) {
            int newResult = 0;
            visited = new boolean[N][N];
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if(!visited[i][j] && lists[i][j] > m) {
                        BFS(i, j, m);
                        newResult++;
                    }
                }
            }
            result = Math.max(result, newResult);
        }

        System.out.println(result);
    }
    public static void BFS(int x, int y, int rainHeight) {
        Queue<Node> queue = new LinkedList<>();

        queue.add(new Node(x,y));
        visited[x][y] = true;

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

            int [] dx = {1,0,-1,0};
            int [] dy = {0,1,0,-1};

            for (int i = 0; i < 4; i++) {
                int newX = value.x + dx[i];
                int newY = value.y + dy[i];
                if(newX >= 0 && newY >= 0 && newX < N && newY < N
                        && lists[newX][newY] > rainHeight && !visited[newX][newY]) {
                    visited[newX][newY] = true;
                    queue.add(new Node(newX, newY));
                }
            }
        }
    }

    public static class Node {
        int x;
        int y;
        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

 

반응형

'CodingTEST' 카테고리의 다른 글

[백준 14503] 로봇 청소기 (JAVA)  (0) 2023.11.23
[백준 2573] 빙산 (JAVA)  (0) 2023.11.23
[백준 5014] 스타트링크 (JAVA)  (0) 2023.11.21
[백준 1697] 숨바꼭질 (JAVA)  (0) 2023.11.21
[백준 7569] 토마토 (JAVA)  (1) 2023.11.19