๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[BAEKJOON python] 2573_๋น์ฐ ๋ณธ๋ฌธ
728x90
๋ฐ์ํ
์ง๊ตฌ ์จ๋ํ๋ก ์ธํ์ฌ ๋ถ๊ทน์ ๋น์ฐ์ด ๋ น๊ณ ์๋ค.
๋น์ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ํ์
๋น์ฐ์ ๊ฐ ๋ถ๋ถ๋ณ ๋์ด ์ ๋ณด๋ ๋ฐฐ์ด์ ๊ฐ ์นธ์ ์์ ์ ์๋ก ์ ์ฅ
๋น์ฐ ์ด์ธ์ ๋ฐ๋ค์ ํด๋น๋๋ ์นธ์๋ 0์ด ์ ์ฅ๋๋ค.
๋น์นธ์ ๋ชจ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค๊ณ ์๊ฐํ๋ค.
๋น์ฐ์ ๋์ด๋ ๋ฐ๋ท๋ฌผ์ ๋ง์ด ์ ํด์๋ ๋ถ๋ถ์์ ๋ ๋นจ๋ฆฌ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์,
๋ฐฐ์ด์์ ๋น์ฐ์ ๊ฐ ๋ถ๋ถ์ ํด๋น๋๋ ์นธ์ ์๋ ๋์ด๋ ์ผ๋ ๋ง๋ค ๊ทธ ์นธ์ ๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก
๋ถ์ด์๋ 0์ด ์ ์ฅ๋ ์นธ์ ๊ฐ์๋งํผ ์ค์ด๋ ๋ค.
๋จ, ๊ฐ ์นธ์ ์ ์ฅ๋ ๋์ด๋ 0๋ณด๋ค ๋ ์ค์ด๋ค์ง ์๋๋ค.
๋ฐ๋ท๋ฌผ์ ํธ์์ฒ๋ผ ๋น์ฐ์ ๋๋ฌ์ธ์ฌ ์์ ์๋ ์๋ค.
2์ฐจ์ ๋ฐฐ์ด์์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ ์นธ๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๋งํ๋ค
ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ฃผ์ด์ง ๋, ์ด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑ
๋ง์ผ ์ ๋ถ ๋ค ๋ น์ ๋๊น์ง ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ 0์ ์ถ๋ ฅ
์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M
N๊ณผ M์ 3 ์ด์ 300 ์ดํ
๋ฐฐ์ด์์ ๋น์ฐ์ด ์ฐจ์งํ๋ ์นธ์ ๊ฐ์, ์ฆ, 1 ์ด์์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ ์นธ์ ๊ฐ์๋ 10,000 ๊ฐ ์ดํ
๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด, ๋ง์ง๋ง ํ๊ณผ ์ด์๋ ํญ์ 0์ผ๋ก ์ฑ์์ง๋ค.
์ฒซ ์ค์ ๋น์ฐ์ด ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ์ถ๋ ฅ
๋ง์ผ ๋น์ฐ์ด ๋ค ๋ น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅ
# 1) BFS
from collections import deque
def bfs(x, y) :
# ๋น์ฐ ์์น
q = deque()
q.append((x, y))
# ์ฃผ๋ณ์ ๋ฐ๋ค๊ฐ ์๋ ๋น์ฐ์ (x, y, ๋ฐ๋ค ๊ฐฏ์)
visited[x][y] = 1
seaList = []
while q :
x, y = q.popleft()
sea = 0
for i in range(4) :
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < M :
if not graph[nx][ny] :
# ๋น์ฐ ์ฃผ๋ณ์ ๋ฐ๋ค ๊ฐฏ์
sea += 1
elif graph[nx][ny] and not visited[nx][ny] :
q.append((nx, ny))
visited[nx][ny] = 1
if sea > 0 :
seaList.append((x, y, sea))
# ๋น์ฐ ๋
น์ด๊ธฐ
for x, y, sea in seaList :
graph[x][y] = max(0, graph[x][y] - sea)
# ํ๋์ ๊ทธ๋ฃน์ ํ์
return 1
N, M = map(int, input().split())
graph = []
for i in range(N) :
graph.append(list(map(int, input().split())))
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
year = 0
ice = []
for i in range(N) :
for j in range(M) :
if graph[i][j] :
# ๋น์ฐ์ ์์น๋ฅผ (i, j)
ice.append((i, j))
while ice :
visited = [[0] * (M) for _ in range(N)]
delList = []
# bfs() ์์ ๋ฐ์์จ ๋น์ฐ ๊ทธ๋ฃน์ ๊ฐ์
result = 0
for i, j in ice :
# ๋น์ฐ ๊ฐ์ ๋ํ๊ธฐ
if graph[i][j] and not visited[i][j] :
result += bfs(i, j)
# ๋น์ฐ์ด ์๋ค๋ฉด
if graph[i][j] == 0 :
delList.append((i, j))
# ๋น์ฐ ๊ทธ๋ฃน์ด 2๊ฐ ์ด์์ด๋ฉด
if result > 1 :
print(year)
break
# ๋ค ๋
น์ ๋น์ฐ ์ ๊ฑฐ
ice = sorted(list(set(ice) - set(delList)))
year += 1
if result < 2 :
print(0)
# input
# 5 7
# 0 0 0 0 0 0 0
# 0 2 4 5 3 0 0
# 0 3 0 2 5 2 0
# 0 7 6 2 4 0 0
# 0 0 0 0 0 0 0
# output
# 2
728x90
๋ฐ์ํ
'๐ฆฅ ์ฝํ > BAEKJOON' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BAEKJOON python] 13458_์ํ๊ฐ๋ (0) | 2022.10.09 |
---|---|
[BAEKJOON python] 14503_๋ก๋ด ์ฒญ์๊ธฐ (0) | 2022.10.09 |
[BAEKJOON python] 5014_์คํํธ๋งํฌ (0) | 2022.10.08 |
[BAEKJOON python] 7569_ํ ๋งํ (0) | 2022.10.08 |
[BAEKJOON python] 9205_๋งฅ์ฃผ ๋ง์๋ฉด์ ๊ฑธ์ด๊ฐ๊ธฐ (0) | 2022.10.08 |
Comments