๋ฌธ์ (์ถ์ฒ: 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 ( ์์ญ์ ๋์ด) ์ถ๋ ฅ
์๊ฐ๐ค
ํ ๋ฒ๋ง์ ํต๊ณผํ๋ ๊ฑด ๋๋ฌด ๊ธฐ๋ถ ์ข์ ์ผ!!!
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 5014_์คํํธ๋งํฌ (0) | 2022.04.08 |
---|---|
[Baekjoon] 11403_๊ฒฝ๋ก ์ฐพ๊ธฐ (0) | 2022.04.07 |
[Baekjoon] 1697_์จ๋ฐ๊ผญ์ง (0) | 2022.04.05 |
[Baekjoon] 7562_๋์ดํธ์ ์ด๋ (0) | 2022.04.04 |
[Baekjoon] 2468_์์ ์์ญ (0) | 2022.04.01 |