https://www.acmicpc.net/problem/2583
๊ทธ๋ํ ํ์ํ๋ ๋ฌธ์ . ๋น์ทํ ์ ํ์ ๋ฌธ์ ๋ฅผ ํ์ด๋ดค์ผ๋ฉด ์ฌ์ด ๋ฌธ์ .
์์ด๋์ด
1. ๋ชจ๋์ข ์ด
- M*N ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ๋ชจ๋์ข ์ด๋ฅผ ๋ํ๋๋ค.
- ์ฃผ์ด์ง ์ง์ฌ๊ฐํ ์ขํ์ ๋ฐ๋ผ ์ง์ฌ๊ฐํ์ ํํํด์ค๋ค. 1์ ์ง์ฌ๊ฐํ, 0์ ๋น๊ณต๊ฐ์ ๋ํ๋ธ๋ค.
- ๋ฌธ์ ์์๋ ์ขํ๊ฐ ์ผ์ชฝ ์๋๊ฐ ์์ (0, 0)์ด์ง๋ง, ๋ฆฌ์คํธ๋ ์ผ์ชฝ ์๊ฐ ์์ ์ด๋ค.
- ์ด์ฐจํผ ๊ฐ๋ก์ถ์ ๋ํด ๋์นญ์ด๋ฏ๋ก ๋ฌธ์ ์์ ์๊ตฌํ ๊ฐ์ ๊ตฌํ๋๋ฐ ๋ฌธ์ ์๋ค๊ณ ํ๋จํด ๊ทธ๋๋ก ํ์๋ค.
2. ๋น๊ณต๊ฐ ๊ฐ์, ๋์ด ๊ตฌํ๊ธฐ
- ๋ชจ๋ ์นธ์ ๋ํด dfs๋ฅผ ํด๋ณธ๋ค.
- ์ ํํ ์นธ์ด 0์ด๋ผ๋ฉด ์ฃผ์๋ฅผ ํ์ํด ๋์ด๋ฅผ ๊ตฌํ๊ณ , ๊ฐ์์ +1 ํด์ค๋ค.
- ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์นธ์ 1๋ก ๋ณํํ์ฌ ์ค๋ณต์ ๋ฐฉ์งํด์ค๋ค.
์ ์ฒด ์ฝ๋
import sys
sys.setrecursionlimit(10**6)
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
def dfs(x, y):
global volume
if x < 0 or x >= M or y < 0 or y >= N:
return 0
if paper[x][y] == 0:
volume += 1
paper[x][y] = 1
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
dfs(nx, ny)
return volume
return 0
M, N, K = map(int, input().split())
paper = [[0] * N for _ in range(M)]
for _ in range(K):
ax, ay, bx, by = map(int, input().split())
for i in range(ax, bx):
for j in range(ay, by):
paper[j][i] = 1
count = 0
volume_list = []
for i in range(M):
for j in range(N):
volume = 0
if dfs(i, j) >= 1:
count += 1
volume_list.append(volume)
volume_list.sort()
print(count)
print(" ".join(map(str, volume_list)))
์ฝ๋ ์ค๋ช
1. ๋ชจ๋ ์ข ์ด
M, N, K = map(int, input().split())
paper = [[0] * N for _ in range(M)]
for _ in range(K):
ax, ay, bx, by = map(int, input().split())
for i in range(ax, bx):
for j in range(ay, by):
paper[j][i] = 1
์์์ ์ค๋ช ํ ๋ชจ๋์ข ์ด๋ฅผ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค.
M * N ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํ ํด์ฃผ๊ณ , ์ง์ฌ๊ฐํ์ 1๋ก ํํํด์ค๋ค.
๊ทธ๋ฆผ๊ณผ ๋ฆฌ์คํธ๊ฐ ๋์นญ์ด์ฌ๋ ๊ฐ์ ๊ตฌํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
2. dfs
for i in range(M):
for j in range(N):
volume = 0
if dfs(i, j) >= 1:
count += 1
volume_list.append(volume)
์ด์ ๊ฐ ํ์นธ๋ง๋ค dfs๋ฅผ ํด๋ณธ๋ค. dfs์ ๋ฆฌํด๊ฐ์ ๋น๊ณต๊ฐ์ ๋์ด๋ฅผ ๋ฆฌํดํ๋ค.
๋ฐ๋ผ์ 1์ด์์ด๋ฉด ๋น๊ณต๊ฐ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก count๊ฐ์ ์ฆ๊ฐ์์ผ์ค๋ค.
dfsํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
def dfs(x, y):
global volume
if x < 0 or x >= M or y < 0 or y >= N:
return 0
if paper[x][y] == 0:
volume += 1
paper[x][y] = 1
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
dfs(nx, ny)
return volume
return 0
๋ฐฉ๋ฌธํ ์นธ์ ๊ฐ์ด 0์ด๋ผ๋ฉด ์ํ์ข์ฐ์ ์๋ ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
๋ชจ๋ ํ์์ด ๋๋๋ฉด ๋์ด(volume)๋ฅผ ๋ฆฌํดํด์ค๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1759 ์ํธ๋ง๋ค๊ธฐ (python ํ์ด์ฌ) (0) | 2023.03.30 |
---|---|
[๋ฐฑ์ค] 11559 puyopuyo (ํ์ด์ฌ python) (0) | 2023.03.26 |
[๋ฐฑ์ค] 14938 ์๊ฐ๊ทธ๋ผ์ด๋ (python ํ์ด์ฌ) (0) | 2022.09.10 |
[๋ฐฑ์ค]11660 ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5 (python ํ์ด์ฌ) (0) | 2022.08.19 |
[๋ฐฑ์ค] 10942 ํฐ๋ฆฐ๋๋กฌ? (python ํ์ด์ฌ) (0) | 2022.08.17 |