백준 2583번 영역 구하기

이상민·2023년 9월 6일
0

알고리즘

목록 보기
47/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Calculate_Area {
    static int N,M,K;
    static int[][] map;
    static boolean[][] visited;
    static int[] dr = {1,0,-1,0};
    static int[] dc = {0,1,0,-1};
    static List<Integer> list;
    static int size = 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());
        M = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        map = new int[N][M];
        visited = new boolean[N][M];
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int lc = Integer.parseInt(st.nextToken());
            int lr = Integer.parseInt(st.nextToken());
            int rc = Integer.parseInt(st.nextToken());
            int rr = Integer.parseInt(st.nextToken());
            draw(lc,lr,rc,rr);
        }
        list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if(!visited[i][j]&&map[i][j]==0){
                    visited[i][j] = true;
                    dfs(i,j);
                    list.add(size);
                    size= 0;
                }
            }
        }
        Collections.sort(list);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");

        }
    }
    public static void draw(int lc,int lr,int rc, int rr){
        for (int i = lr; i < rr; i++) {
            for (int j = lc; j < rc; j++) {
                map[i][j] = 1;
            }
        }
    }
    public static void dfs(int row, int col){
        size++;
        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>=M)
                continue;
            if (!visited[nrow][ncol]&&map[nrow][ncol]==0){
                visited[nrow][ncol] = true;
                dfs(nrow,ncol);
            }
        }
    }
}

풀이방법

  1. 우선 입력값에 따라 map에 사각형에 해당하는 부분을 1표시한다.(x축y축과 행,열은 다르다 주의하자)
  2. 방문하지 않은 칸이고, 사각형이 아닌부분이라면 dfs를 탐색한다.
  3. 한칸 탐색할때마다 size를 증가시키고 dfs탐색이 끝나면 size를 list에 담는다.
  4. list를 오름차순 정렬하고 list크기와 내용을 출력한다.

후기

사각형 그리는 부분만 문제 없다면 평이한 dfs문제이다.
근데 x축 y축이랑 행과 열 반대인데 일부로 헷갈리라고 저렇게 내는건가?
이런류의 문제 몇번 낚여서 이제 안낚이지만, 굳이 그렇게 내야하나 싶긴하다.

profile
개린이

0개의 댓글