💡Problem Solving/BOJ

[BOJ 2583] 영역 구하기 (Java)

gom20 2021. 12. 25. 19:25

문제

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

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

풀이

좌표 영역을 칠하고, DFS로 빈 공간의 개수와 넓이를 구한다. 

영역 칸의 개수를 구해야 하기 때문에, 입력된 좌표를 그대로 사용하면 정확한 답을 구할 수 없다.-

이를 해결하기 위해, 칠할 영역 시작 좌표의 x, y 좌표는 +1을 해주어서 좌표의 기준을 우측 대각선 위로 동일하게 맞춰주었다.

ex) 칠해야 할 영역의 시작 좌표가 0, 0 일 경우 1, 1로 변경해서 칠한다.

 

소스코드

package dfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class BOJ2583 {
    static int M, N, K, size;
    static int[][] map;
    static int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        map = new int[N+1][M+1];
        for(int i = 0; i < K; i++){
            st = new StringTokenizer(br.readLine());
            int sx = Integer.parseInt(st.nextToken()) + 1;
            int sy = Integer.parseInt(st.nextToken()) + 1;
            int ex = Integer.parseInt(st.nextToken());
            int ey = Integer.parseInt(st.nextToken());

            for(int x = sx; x <= ex; x++){
                for(int y = sy; y <= ey; y++){
                    map[x][y] = 1;
                }
            }
        }

        ArrayList<Integer> answer = new ArrayList<Integer>();
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= M; j++){
                if(map[i][j] == 0){
                    size = 0;
                    dfs(i, j);
                    answer.add(size);
                }
            }
        }
        System.out.println(answer.size());
        Collections.sort(answer);
        StringBuilder sb = new StringBuilder();
        for(int n : answer){
            sb.append(n + " ");
        }
        System.out.println(sb.toString());
    }

    public static void dfs(int x, int y){
//        System.out.println(x+", "+y);
        map[x][y] = 1;
        size++;
        for(int[] d : dir){
            int nx = x + d[0];
            int ny = y + d[1];
            if(isValid(nx, ny)){
                dfs(nx, ny);
            }
        }
    }

    public static boolean isValid(int nx, int ny){
        if(nx < 1 || ny < 1 || nx > N || ny > M) return false;
        if(map[nx][ny] == 1) return false;
        return true;
    }
}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 6603] 로또 (Java)  (0) 2021.12.28
[BOJ 1261] 알고스팟 (Java)  (0) 2021.12.27
[BOJ 1074] Z (Java)  (0) 2021.12.24
[BOJ 16234] 인구 이동 (Java, Python)  (0) 2021.12.23
[BOJ 2485] 가로수 (Java)  (0) 2021.12.21