๋ฌธ์
๋๊ธ์ ๊ฐ๊ฒฉ์ด 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๊ฐ์ ์ง์ฌ๊ฐํ๋ค์ด ๋ชจ๋์ข ์ด ์ ์ฒด๋ฅผ ์ฑ์ฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ถ๋ฆฌ๋์ด ๋๋์ด์ง๋ ์์ญ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋์งธ ์ค์๋ ๊ฐ ์์ญ์ ๋์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ถ๋ ฅํ๋ค.
https://www.acmicpc.net/problem/2583
๐ก ํ์ด ๋ฐ ์ฝ๋
# DFS
import sys
sys.setrecursionlimit(10**6) # ์ฌ๊ท์ ๊น์ด ๋ณ๊ฒฝ (RecursionError)
m, n, k = map(int, input().split())
graph = [[0] * n for _ in range(m)]
for _ in range(k):
x1, y1, x2, y2 = map(int, input().split())
for i in range(y1, y2):
for j in range(x1, x2):
graph[i][j] = 1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
count = 0
def dfs(x, y):
global count
if x<0 or x>=m or y<0 or y>=n:
return 0
if graph[x][y] == 1:
return 0
graph[x][y] = 1
count += 1
for i in range(4):
dfs(x+dx[i], y+dy[i])
return count
result = []
for i in range(m):
for j in range(n):
cnt = dfs(i,j)
if cnt:
result.append(cnt)
count = 0
result.sort()
print(len(result))
for i in result:
print(i, end=' ')
๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋จ๋ฒ์ ์ ํ์ ์ธ ๊ทธ๋ํ ํ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค. ์ฒ์์๋ DFS์ BFS ์ค DFS ๋ฐฉ์์ ์ ํํ์ฌ ํ์ดํ์๋๋ฐ Python์ด ์ ํ ์ต๋ ์ฌ๊ท ๊น์ด๋ณด๋ค ๋์ ์ฝ๋ ์ ์ฌ๊ท์ ๊น์ด๊ฐ ๋ ๊น์ด RecursionError๊ฐ ๋ฐ์ํ๋ค. ์ฐ์ ์ sys.setrecursionlimit(10**6)๋ก ์ฌ๊ท์ ๊น์ด๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์์ง๋ง ์ด ๋ฌธ์ ์์๋ DFS ๋ฐฉ์์ด ์ ํฉํ์ง ์์์ ๊นจ๋ซ๊ณ BFS ๋ฐฉ์์ผ๋ก๋ ํ์ดํด ๋ณด์๋ค.
BFS๋ก ๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
# BFS
from collections import deque
m, n, k = map(int, input().split())
graph = [[0] * n for _ in range(m)]
for _ in range(k):
x1, y1, x2, y2 = map(int, input().split())
for i in range(x1, x2):
for j in range(m - y1 - 1, m - y2 - 1, -1):
graph[j][i] = 1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y):
global answer
queue = deque()
queue.append((x, y))
graph[x][y] = 1
size = 1
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < m and 0 <= ny < n and graph[nx][ny] == 0:
graph[nx][ny] = 1
queue.append((nx, ny))
size += 1
result.append(size)
result = []
for i in range(m):
for j in range(n):
if graph[i][j] == 0:
bfs(i, j)
result.sort()
print(len(result))
for i in result:
print(i, end=' ')
'Algorithm > ๐ Baekjoon Judge' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 10026๋ฒ ์ ๋ก์์ฝ - ํ์ด์ฌ(Python) (0) | 2021.07.25 |
---|---|
[BOJ] ๋ฐฑ์ค 2468๋ฒ ์์ ์์ญ - ํ์ด์ฌ(Python) (0) | 2021.07.18 |
[BOJ] ๋ฐฑ์ค 1697๋ฒ ์จ๋ฐ๊ผญ์ง - ํ์ด์ฌ(Python) (0) | 2021.07.15 |
[BOJ] ๋ฐฑ์ค 7576๋ฒ ํ ๋งํ - ํ์ด์ฌ(Python) (0) | 2021.07.15 |
[BOJ] ๋ฐฑ์ค 2667๋ฒ ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ - ํ์ด์ฌ(Python) (0) | 2021.07.15 |