백준 2468번 안전영역

이상민·2023년 9월 6일
0

알고리즘

목록 보기
44/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Safe_Area {
    static int N;
    static int[][] map;
    static int[] dr = {1,0,-1,0};
    static int[] dc = {0,1,0,-1};
    static int answer = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        map = new int[N][N];
        int height = Integer.MIN_VALUE;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                height = Math.max(height,map[i][j]);
            }
        }
        for (int i = 0; i < height; i++) {
            boolean[][] visited = new boolean[N][N];
            flood(i,visited);
        }
        System.out.println(answer);
    }
    public static void flood(int height, boolean[][] visited){
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(map[i][j]<height){
                    visited[i][j] = true;
                }
            }
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(!visited[i][j]){
                    visited[i][j] = true;
                    dfs(i,j,visited);
                    count++;
                }
            }
        }
        answer = Math.max(answer,count);
    }
    public static void dfs(int row, int col,boolean[][]visited){
        for (int i = 0; i < 4; i++) {
            int nrow = row + dr[i];
            int ncol = col + dc[i];
            if(nrow<0||ncol<0||nrow>=N||ncol>=N)
                continue;
            if(!visited[nrow][ncol]){
                visited[nrow][ncol] = true;
                dfs(nrow,ncol,visited);
            }
        }
    }
}

풀이방법

  1. 입력값에서 최대 높이를 구한다.
  2. 0부터 최대 높이까지 물에 잠기는것을 가정한다. 잠긴 칸은 visited=true로 체크한다.
  3. 물에 잠기지 않은 칸을 dfs()탐색하고, 영역의 갯수를 센다.
  4. 높이에 따라 영역의 갯수가 최대일때를 구하고 출력한다.

후기

과정이 나눠져서 그렇지 차례로 하나씩 구현하면 어렵지 않은 문제였다.
for문안에서 전부 해결하려고 하지않고 함수를 분리하여 더 직관적으로 풀수 있었던것 같다.

profile
개린이

0개의 댓글