Algorithm/BOJ

[Silver I/JAVA] 2583 ์˜์—ญ ๊ตฌํ•˜๊ธฐ

carsumin 2024. 12. 12. 17:15

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

 

 

์กฐ๊ฑด
  • M*N ๋ชจ๋ˆˆ์ข…์ด์— K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆผ
  • K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๊ตฌํ•˜๋Š” ๊ฒƒ
  • ๋ถ„๋ฆฌ๋œ ์˜์—ญ ๊ฐœ์ˆ˜, ๊ฐ ์˜์—ญ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅ(์˜ค๋ฆ„์ฐจ์ˆœ)
ํ•„์š”ํ•œ ๊ฒƒ
  • ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ dx, dy ๋ฐฐ์—ด
  • ์˜์—ญ ๋„“์ด ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ArrayList (๋„“์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€์ ์ธ ArrayList ์‚ฌ์šฉ)
  • ์˜์—ญ ๋„“์ด๋ฅผ ์ €์žฅํ•  cnt
ํ’€์ด
  • ์—ฌ๊ธฐ์„œ M์ด ๋†’์ด, N์ด ๋„ˆ๋น„์ด๋‹ค.
  • x,y์ขŒํ‘œ๊ฐ’์€ ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๋”๋ผ๋„ ๊ทธ๋Œ€๋กœ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ด๋„ ๋„“์ด๋Š” ๊ฐ™๋‹ค.

  • x, y ๋ฒ”์œ„๋งŒํผ ์˜์—ญ์„ 1๋กœ ์ฑ„์›Œ์คŒ
  • ๋นˆ ์˜์—ญ์„ DFS ํƒ์ƒ‰ 

 

์ „์ฒด ์ฝ”๋“œ
import java.io.*;
import java.util.*;

public class Main{
    static int[][] grid;
    static ArrayList<Integer> list = new ArrayList<>();
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};
    static int N,M;
    static int cnt;
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");
        M = Integer.parseInt(str[0]); //M:๋†’์ด
        N = Integer.parseInt(str[1]); //N:๋„ˆ๋น„
        int K = Integer.parseInt(str[2]); //K:์ง์‚ฌ๊ฐํ˜• ๊ฐœ์ˆ˜
        
        //grid ์ดˆ๊ธฐํ™”
        grid = new int[N][M];
        
        //์ขŒํ‘œ์ž…๋ ฅ
        for(int i=0; i<K; i++){
            str = br.readLine().split(" ");
            int x1 = Integer.parseInt(str[0]);
            int y1 = Integer.parseInt(str[1]);
            int x2 = Integer.parseInt(str[2]);
            int y2 = Integer.parseInt(str[3]);
            
            for(int x=x1; x<x2; x++){
                for(int y=y1; y<y2; y++){
                    grid[x][y] = 1; //์˜์—ญ 1๋กœ ์ฑ„์šฐ๊ธฐ
                }
            }
        }
        
        //DFS ํƒ์ƒ‰ (0,0)๋ถ€ํ„ฐ
        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                if(grid[i][j]==0){
                    cnt = 0;
                    dfs(i, j);
                    list.add(cnt); //DFSํƒ์ƒ‰ ๋๋‚œ ๋’ค count๊ฐ’ list์— ๊ฒฐ๊ณผ์ €์žฅ
                }
            }
        }
        
        //์ถœ๋ ฅ : ๋ถ„๋ฆฌ๋œ ์˜์—ญ ๊ฐœ์ˆ˜
        System.out.println(list.size());
        
        //์ถœ๋ ฅ : ๊ฐ ์˜์—ญ ๋„“์ด ์˜ค๋ฆ„์ฐจ์ˆœ
        Collections.sort(list);
        for(Integer i : list){
            System.out.print(i + " ");
        }
    }
    
    //DFS
    private static void dfs(int x, int y){
        //์˜์—ญ์ด ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉด cnt ์ฆ๊ฐ€
        grid[x][y] = 1;
        cnt++;
        
        for(int i=0; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];
            
            if(nx>=0 && nx<N && ny>=0 && ny<M){
                if(grid[nx][ny]==0){ //๋นˆ์˜์—ญ์ด๋ฉด ํƒ์ƒ‰ ๊ณ„์†
                    dfs(nx, ny);
                }
            }
        }
    }
}