DevYoon
[๋ฐฑ์ค] 2573. ๋น์ฐ (Python) ๋ณธ๋ฌธ
link ๐ https://www.acmicpc.net/problem/2573
๋ฌธ์ ์ค๋ช
์ง๊ตฌ ์จ๋ํ๋ก ์ธํ์ฌ ๋ถ๊ทน์ ๋น์ฐ์ด ๋ น๊ณ ์๋ค. ๋น์ฐ์ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ์ด 2์ฐจ์ ๋ฐฐ์ด์ ํ์ํ๋ค๊ณ ํ์. ๋น์ฐ์ ๊ฐ ๋ถ๋ถ๋ณ ๋์ด ์ ๋ณด๋ ๋ฐฐ์ด์ ๊ฐ ์นธ์ ์์ ์ ์๋ก ์ ์ฅ๋๋ค. ๋น์ฐ ์ด์ธ์ ๋ฐ๋ค์ ํด๋น๋๋ ์นธ์๋ 0์ด ์ ์ฅ๋๋ค. ๊ทธ๋ฆผ 1์์ ๋น์นธ์ ๋ชจ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค๊ณ ์๊ฐํ๋ค.
2 | 4 | 5 | 3 | |||
3 | 2 | 5 | 2 | |||
7 | 6 | 2 | 4 | |||
๊ทธ๋ฆผ 1. ํ์ ๊ฐ์๊ฐ 5์ด๊ณ ์ด์ ๊ฐ์๊ฐ 7์ธ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋น์ฐ์ ๋์ด ์ ๋ณด
๋น์ฐ์ ๋์ด๋ ๋ฐ๋ท๋ฌผ์ ๋ง์ด ์ ํด์๋ ๋ถ๋ถ์์ ๋ ๋นจ๋ฆฌ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด์์ ๋น์ฐ์ ๊ฐ ๋ถ๋ถ์ ํด๋น๋๋ ์นธ์ ์๋ ๋์ด๋ ์ผ๋ ๋ง๋ค ๊ทธ ์นธ์ ๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ 0์ด ์ ์ฅ๋ ์นธ์ ๊ฐ์๋งํผ ์ค์ด๋ ๋ค. ๋จ, ๊ฐ ์นธ์ ์ ์ฅ๋ ๋์ด๋ 0๋ณด๋ค ๋ ์ค์ด๋ค์ง ์๋๋ค. ๋ฐ๋ท๋ฌผ์ ํธ์์ฒ๋ผ ๋น์ฐ์ ๋๋ฌ์ธ์ฌ ์์ ์๋ ์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฆผ 1์ ๋น์ฐ์ ์ผ๋ ํ์ ๊ทธ๋ฆผ 2์ ๊ฐ์ด ๋ณํ๋๋ค.
๊ทธ๋ฆผ 3์ ๊ทธ๋ฆผ 1์ ๋น์ฐ์ด 2๋ ํ์ ๋ณํ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค. 2์ฐจ์ ๋ฐฐ์ด์์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ ์นธ๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๋งํ๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฆผ 2์ ๋น์ฐ์ ํ ๋ฉ์ด๋ฆฌ์ด์ง๋ง, ๊ทธ๋ฆผ 3์ ๋น์ฐ์ ์ธ ๋ฉ์ด๋ฆฌ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
2 | 4 | 1 | ||||
1 | 1 | 5 | ||||
5 | 4 | 1 | 2 | |||
๊ทธ๋ฆผ 2
3 | ||||||
4 | ||||||
3 | 2 | |||||
๊ทธ๋ฆผ 3
ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ฃผ์ด์ง ๋, ์ด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๊ทธ๋ฆผ 1์ ๋น์ฐ์ ๋ํด์๋ 2๊ฐ ๋ต์ด๋ค. ๋ง์ผ ์ ๋ถ ๋ค ๋ น์ ๋๊น์ง ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ 0์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ
์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M์ด ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. N๊ณผ M์ 3 ์ด์ 300 ์ดํ์ด๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ M๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0 ์ด์ 10 ์ดํ์ด๋ค. ๋ฐฐ์ด์์ ๋น์ฐ์ด ์ฐจ์งํ๋ ์นธ์ ๊ฐ์, ์ฆ, 1 ์ด์์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ ์นธ์ ๊ฐ์๋ 10,000 ๊ฐ ์ดํ์ด๋ค. ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด, ๋ง์ง๋ง ํ๊ณผ ์ด์๋ ํญ์ 0์ผ๋ก ์ฑ์์ง๋ค.
์ถ๋ ฅ
์ฒซ ์ค์ ๋น์ฐ์ด ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ์ถ๋ ฅํ๋ค. ๋ง์ผ ๋น์ฐ์ด ๋ค ๋ น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
์ฝ๋
import sys
from collections import deque
# ๋ค ๋ฐฉํฅ์ผ๋ก ๋ถ์ด ์๋ 0์ธ ์นธ ๊ฐ์ ํ์ธ
def check_dir(x, y):
count = 0
for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
dx, dy = x+i, y+j
if 0 > dx or dx >= X or 0 > dy or dy >= Y:
continue
if not board[dx][dy]:
count += 1
return count
# ๋น์ฐ ์ฐพ๊ธฐ
def find_ice():
newQ = deque()
for x in range(X):
for y in range(Y):
if board[x][y]:
# ๋น์ฐ์ด๋ฉด q์ ๋ด๊ธฐ
newQ.append((x, y))
return newQ, len(newQ)
# ๋น์ฐ๋ค ๋
น์ด๊ธฐ
def melt_ice(q):
melt = deque()
while q:
nx, ny = q.popleft()
count = check_dir(nx, ny)
melt.append((nx, ny, count))
for mx, my, mCount in melt:
board[mx][my] -= mCount
if board[mx][my] < 0:
board[mx][my] = 0
# ๋น์ฐ ๋ฉ์ด๋ฆฌ ๊ตฌํ๊ธฐ
def bfs_ice(x, y):
q = deque([(x, y)])
count = set([(x, y)])
while q:
nx, ny = q.popleft()
for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
dx, dy = nx+i, ny+j
if 0 > dx or dx >= X or 0 > dy or dy >= Y:
continue
if board[dx][dy] and (dx, dy) not in count:
q.append((dx, dy))
count.add((dx, dy))
return len(count)
X, Y = map(int, input().split())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(X)]
turn = 0
# ์ด๊ธฐ ๋น์ฐ๊ณผ ๊ทธ ๊ฐ์
q, ice = find_ice()
while True:
turn += 1
melt_ice(q)
q, ice = find_ice()
if q:
bfs_count = bfs_ice(q[0][0], q[0][1])
else:
break
# ๋น์ฐ ๊ฐ์์ ์ฒซ ๋ฒ์งธ ๋น์ฐ์ผ๋ก ๊ตฌํ ๋ฉ์ด๋ฆฌ ํฌ๊ธฐ(๊ฐ์)๊ฐ ๋ถ์ผ์นํ๋ฉด
# ๋ฉ์ด๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋ ๊ฒ
if bfs_count != ice:
print(turn)
exit(0)
# ๋น์ฐ ๋ค ๋
น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0 ์ถ๋ ฅ
print(0)
- ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํฌ๊ฒ 4๋จ๊ณ๋ก ๊ตฌ๋ถํด ํ์๋ค.
- ๋น์ฐ ๊ตฌํ๊ธฐ
- ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๋น์ฐ์ธ ๊ฒ๋ค์ ๊ตฌํด์ deque์ ๋ด๋๋ค.
- ๋น์ฐ ๋
น์ด๊ธฐ
- ์์์ ๊ตฌํ ๋น์ฐ ๋ฐฐ์ด์ ํ๋์ฉ ๊บผ๋ด์ ์ฌ๋ฐฉํฅ์ 0์ธ ์นธ ๊ฐ์๋ฅผ ์ธ๊ณ , ๊ทธ ๊ฐ์๋งํผ ๋ น์ธ๋ค.
- ์๋ก ๋น์ฐ ๊ตฌํ๊ธฐ
- ๋น์ฐ์ ๋ น์์ผ๋ ๋ค์ ์๋ก์ด ๋น์ฐ ๋ฐฐ์ด์ ๊ตฌํ๋ค.
- ๋น์ฐ ๋ถ๋ฆฌ๋์๋์ง ํ์ธ
- bfs๋ฅผ ํ์ฉํด์ ๋น์ฐ ๋ฐฐ์ด์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ขํ๋ฅผ ๊ฐ์ง๊ณ ๋ฉ์ด๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ค.
- ๋ง์ฝ ๋น์ฐ ๋ฐฐ์ด์ ํฌ๊ธฐ(๊ธธ์ด)์ bfs๋ก ๊ตฌํ ๋ฉ์ด๋ฆฌ์ ํฌ๊ธฐ๊ฐ ์ผ์นํ์ง ์๋๋ค๋ฉด, ๋น์ฐ์ ๋ฉ์ด๋ฆฌ๊ฐ 2๊ฐ ํน์ ๊ทธ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋ ๊ฒ์ด๋ค.
- ๋น์ฐ ๊ตฌํ๊ธฐ
- ์ฃผ์์ฌํญ
- ๋น์ฐ์ด ๋ชจ๋ ๋ น์ ๋๊น์ง ๋ฉ์ด๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํด์ค์ผ ํ๋ค.
- ์ฝ๋์์ q๊ฐ ๋น์์ ๋(๋น์ฐ์ด ๋ ์๋ค๋ ๋ป) break๋ก while๋ฌธ์ ํ์ถํ๊ณ , ๋ง์ง๋ง์ 0์ printํด์คฌ๋ค.