[BFS / DFS] [백준 / 2583 ] 실버1 - 영역 구하기 (java/자바)

SlowAnd·2024년 2월 14일

[BFS / DFS] [백준 / 2583 ] 실버1 - 영역 구하기 (java/자바)

문제

성공 코드

package BFS_DFS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class boj_2583 {
    static int M, N, K;
    static int[][] matrix;
    static boolean[][] isVisited;
    static int[] dx = {0, 0, 1, -1};
    static int[] dy = {1, -1, 0, 0};
    static int area;

    public static void main(String[] args) throws IOException {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(r.readLine());
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        matrix = new int[M][N];
        isVisited = new boolean[M][N];

        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(r.readLine());
            int startX = Integer.parseInt(st.nextToken());
            int startY = Integer.parseInt(st.nextToken());
            int endX = Integer.parseInt(st.nextToken());
            int endY = Integer.parseInt(st.nextToken());

            for (int y = startY; y < endY; y++) {
                for (int x = startX; x < endX; x++) {
                    matrix[y][x] = 1;
                }
            }
        }

        List<Integer> areas = new ArrayList<>();
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (matrix[i][j] == 0 && !isVisited[i][j]) {
                    area = 0;
                    dfs(i, j);
                    areas.add(area);
                }
            }
        }

        Collections.sort(areas);
        System.out.println(areas.size());
        for (int size : areas) {
            System.out.print(size + " ");
        }
    }

    static void dfs(int y, int x) {
        isVisited[y][x] = true;
        area++;

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 0 && ny >= 0 && nx < N && ny < M) {
                if (matrix[ny][nx] == 0 && !isVisited[ny][nx]) {
                    dfs(ny, nx);
                }
            }
        }
    }
}

주의할 점

시작점(0,0)이 맨 왼쪽아래다. 초기화할 때 주의해야한다.
이 부분만 주의하면 쉬운 문제가 된다.

0개의 댓글