๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 2583_์˜์—ญ ๊ตฌํ•˜๊ธฐ

๋ฟŒ์•ผ._. 2022. 4. 6. 12:13

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/2583)

<์˜์—ญ ๊ตฌํ•˜๊ธฐ>

๋ฌธ์ œ 

 

๋ˆˆ๊ธˆ์˜ ๊ฐ„๊ฒฉ์ด 1์ธ M×N(M, N≤100) ํฌ๊ธฐ์˜ ๋ชจ๋ˆˆ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ด ๋ชจ๋ˆˆ์ข…์ด ์œ„์— ๋ˆˆ๊ธˆ์— ๋งž์ถ”์–ด K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ๋•Œ, ์ด๋“ค K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด M=5, N=7 ์ธ ๋ชจ๋ˆˆ์ข…์ด ์œ„์— <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• 3๊ฐœ๋ฅผ ๊ทธ๋ ธ๋‹ค๋ฉด, ๊ทธ ๋‚˜๋จธ์ง€ ์˜์—ญ์€ <๊ทธ๋ฆผ 2>์™€ ๊ฐ™์ด 3๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๊ฒŒ ๋œ๋‹ค.

<๊ทธ๋ฆผ 2>์™€ ๊ฐ™์ด ๋ถ„๋ฆฌ๋œ ์„ธ ์˜์—ญ์˜ ๋„“์ด๋Š” ๊ฐ๊ฐ 1, 7, 13์ด ๋œ๋‹ค.

M, N๊ณผ K ๊ทธ๋ฆฌ๊ณ  K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ฆฌ๋œ ๊ฐ ์˜์—ญ์˜ ๋„“์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€๋ฅผ ๊ตฌํ•˜์—ฌ ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— M๊ณผ N, ๊ทธ๋ฆฌ๊ณ  K๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. M, N, K๋Š” ๋ชจ๋‘ 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ์˜ ์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋ˆˆ์ข…์ด์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋Š” (0,0)์ด๊ณ , ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋Š”(N, M)์ด๋‹ค. ์ž…๋ ฅ๋˜๋Š” K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•๋“ค์ด ๋ชจ๋ˆˆ์ข…์ด ์ „์ฒด๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

 

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„์— ๋ถ„๋ฆฌ๋˜์–ด ๋‚˜๋ˆ„์–ด์ง€๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ์˜์—ญ์˜ ๋„“์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution (Python)

import sys
from collections import deque

def bfs(graph, start, visited):
    dx=[-1,1,0,0]
    dy=[0,0,-1,1]

    queue=deque([start])
    size=0 # ์˜์—ญ์˜ ๋„“์ด

    while queue:
        temp=queue.popleft()
        size+=1
        for i in range(4):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            if x>=0 and x<len(graph) and y>=0 and y<len(graph[0]): # ๋ชจ๋ˆˆ์ข…์ด ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด
                if visited[x][y]==0:
                    queue.append([x,y])
                    visited[x][y]=1
    return size

if __name__=='__main__':
    m,n,k=map(int, sys.stdin.readline().split())

    graph=[[0]*m for i in range(n)] # ๋ชจ๋ˆˆ์ข…์ด
    visited = [[0] * m for i in range(n)] # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€

    for i in range(k):
        x1,y1,x2,y2=map(int,sys.stdin.readline().split())

        for a in range(x1, x2): # ๋ชจ๋ˆˆ์ข…์ด์— ์ง์‚ฌ๊ฐํ˜• ํ‘œ์‹œ
            for b in range(y1, y2):
                graph[a][b]=1
                visited[a][b]=1

    answer=0 # ์˜์—ญ์˜ ๊ฐœ์ˆ˜
    arr=[] # ์˜์—ญ์˜ ๋„“์ด
    for i in range(n):
        for j in range(m):
            if graph[i][j]==0 and visited[i][j]==0: 
                answer+=1
                visited[i][j]=1
                size=bfs(graph,[i,j], visited)
                arr.append(size)
    arr.sort() # ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    print(answer)
    print(' '.join(map(str,arr)))

 

- my solution (JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

public class _2583_์˜์—ญ๊ตฌํ•˜๊ธฐ {
	static int bfs(int[][] graph, int [] start, int[][] visited) {
		int dx[]= {-1,1,0,0};
		int dy[]= {0,0,-1,1};
		
		Queue<int []> queue=new LinkedList<>();
		queue.add(start);
		int size=0; // ์˜์—ญ์˜ ๋„“์ด
		
		while(queue.size()!=0) {
			int temp[]=queue.poll();
			size+=1;
			for(int i=0; i<4; i++) {
				int x=temp[0]+dx[i];
				int y=temp[1]+dy[i];
				if(x>=0 && x<graph.length && y>=0 && y<graph[0].length) { // ๋ชจ๋ˆˆ์ข…์ด ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด
					if(visited[x][y]==0) {
						queue.add(new int[] {x,y});
						visited[x][y]=1;
					}
				}
			}
		}
		return size;
	}

	public static void main(String[] args) throws IOException{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		String s=bf.readLine();
		int m= Integer.parseInt(s.split(" ")[0]);
		int n=Integer.parseInt(s.split(" ")[1]);
		int k=Integer.parseInt(s.split(" ")[2]);
		
		int graph[][]=new int[n][m]; // ๋ชจ๋ˆˆ์ข…์ด
		int visited[][]=new int[n][m]; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
		
		for(int i=0; i<k; i++) { // ๋ชจ๋ˆˆ์ข…์ด์— ์ง์‚ฌ๊ฐํ˜• ํ‘œ์‹œ
			s=bf.readLine();
			int x1=Integer.parseInt(s.split(" ")[0]);
			int y1=Integer.parseInt(s.split(" ")[1]);
			int x2=Integer.parseInt(s.split(" ")[2]);
			int y2=Integer.parseInt(s.split(" ")[3]);
			
			for(int a=x1; a<x2; a++) {
				for(int b=y1; b<y2; b++) {
					graph[a][b]=1;
					visited[a][b]=1;
				}
			}
		}
		
		int answer=0; // ์˜์—ญ์˜ ๊ฐœ์ˆ˜
		ArrayList<Integer> arr=new ArrayList<>(); // ์˜์—ญ์˜ ๋„“์ด
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++) {
				if(graph[i][j]==0 && visited[i][j]==0) {
					answer+=1;
					visited[i][j]=1;
					int size=bfs(graph,new int[] {i,j}, visited);
					arr.add(size);
				}
			}
		}
		Collections.sort(arr); // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
		System.out.println(answer);
		for(int i=0; i<arr.size(); i++) {
			System.out.print(arr.get(i)+" ");
		}
	}

}

 

 

์ง์‚ฌ๊ฐํ˜• ๋„“์ด๋งŒํผ ๋ชจ๋ˆˆ์ข…์ด์— ๊ทธ๋ ค์ค€ ํ›„ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์„ ์ฐพ์•„ ๋„“์ด๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋ฌธ์ œ์—์„œ๋Š” ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋ฅผ (0,0)์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ทธ๋ฆฐ ๊ฒƒ์ด์ง€๋งŒ, ์ฝ”๋“œ ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์™ผ์ชฝ ์œ„๋ฅผ (0,0)์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

๊ทธ๋ž˜์„œ ์„ธ๋กœ๊ฐ€ n, ๊ฐ€๋กœ๊ฐ€ m์ด ๋˜์—ˆ๋‹ค.

 

  • bfs ( ๋ชจ๋ˆˆ์ข…์ด, ์‹œ์ž‘ ์œ„์น˜, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€)
    : dx, dy = ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ
    : size = ์˜์—ญ์˜ ๋„“์ด
    : queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop ๋ฐ ์˜์—ญ์˜ ๋„“์ด +1 -> ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋ชจ๋ˆˆ์ข…์ด ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด queue์— ์ถ”๊ฐ€ ๋ฐ ๋ฐฉ๋ฌธ check
    : size ๋ฐ˜ํ™˜

  • main
    : m, n, k = ๋ชจ๋ˆˆ์ข…์ด ํฌ๊ธฐ, ์ง์‚ฌ๊ฐํ˜• ์ˆ˜
    : graph = ๋ชจ๋ˆˆ์ข…์ด
    : visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    : k๊ฐœ๋งŒํผ ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ๊ณผ ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅ๋ฐ›์€ ํ›„ graph์™€ visited์— ํ‘œ์‹œ
    : answer = ์˜์—ญ์˜ ๊ฐœ์ˆ˜
    : arr =  ์˜์—ญ์˜ ๋„“์ด
    : ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด -> answer +1 , ๋ฐฉ๋ฌธ check, ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’ arr์— ์ถ”๊ฐ€
    : ์˜์—ญ์˜ ๋„“์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
    : answer ( ์˜์—ญ์˜ ๊ฐœ์ˆ˜) , arr ( ์˜์—ญ์˜ ๋„“์ด) ์ถœ๋ ฅ

์ƒ๊ฐ๐Ÿค”

 

ํ•œ ๋ฒˆ๋งŒ์— ํ†ต๊ณผํ•˜๋Š” ๊ฑด ๋„ˆ๋ฌด ๊ธฐ๋ถ„ ์ข‹์€ ์ผ!!!