๐ญ ๋ฌธ์ ์ดํด
ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
๋งค๋ , ๋น์ฐ์ ์ฌ๋ฐฉ์ผ๋ก ์ ํ ๋ฐ๋ค๋ฉด(0)์ ๊ฐ์๋งํผ ๋ น์๋ด๋ฆฐ๋ค.
ํด๋ง๋ค ๋ น์๋ด๋ฆฌ๋ค๋ณด๋ฉด ์ด๋ ์์ ์ ๋น์ฐ์ด ๋์ด์ง๋ฉฐ ๋ฉ์ด๋ฆฌ๊ฐ ๋๋๊ฒ ๋๋ค.
์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ 2๋ ์ด ์ง๋๋ฉด(๋ ๋ฒ ๋ น์ผ๋ฉด) ๋ฉ์ด๋ฆฌ๊ฐ ์ธ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด์ง๋ค.
๋ช ๋ ์ด ์ง๋๋ฉด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋๋์ด์ง๋์ง ๊ณ์ฐํ๋ ๋ฌธ์ ์ด๋ค.
1. ๋น์ฐ์ ๋ น์ธ๋ค.
2. ๋๋น ์ฐ์ ํ์์ ํ๋ฉฐ ๋ฉ์ด๋ฆฌ ๊ฐ์๋ฅผ ์ธ๋ณธ๋ค.
3. ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋๋๊ฑฐ๋, ๋ ์ด์ ๋จ์ ๋น์ฐ์ด ์๋ค๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
โ๏ธ์ฌ๊ธฐ์ ๋ด๊ฐ ๋์ณค๋ ํฌ์ธํธ๋ ๋น์ฐ์ ํ์ฌ ๊ธฐ์ค์ผ๋ก ๋ น์ด๋ฉด ์๋ชป ๊ณ์ฐํ๋ค๋ ์ ์ด๋ค.
๋ฌด์จ ๋ง์ด๋๋ฉด,,
- ๋จผ์ (1, 1) ์์น์ ๋์ด 2์ธ ๋น์ฐ์ ์ผ์ชฝ๊ณผ ์์ชฝ์ด ๋ฐ๋ท๋ฌผ์ด๋ฏ๋ก 1๋ ์ด ์ง๋๋ฉด ๋ชจ๋ ๋ น์ 0์ด ๋๋ค.
๋ฌผ | ||||||
๋ฌผ | 2 => 0 | 4 | 5 | 3 | ||
3 | 2 | 5 | 2 | |||
7 | 6 | 2 | 4 | |||
- ๊ทธ ์ํ์์ ๊ทธ๋๋ก (1, 2) ์์น์ ๋์ด 4์ธ ๋น์ฐ์ ๊ณ์ฐํ๋ฉด 3๋ฉด์ด ๋ฐ๋ค์ด๋ฏ๋ก(ํ๋ฐ๋..?) 1์ด ๋๋ค.
๋ฌผ | ||||||
๋ฌผ | 4 => 1 | 5 | 3 | |||
3 | ๋ฌผ | 2 | 5 | 2 | ||
7 | 6 | 2 | 4 | |||
- ๊ทธ๋ฌ๋ ์ ์๊ฐํด๋ณด๋ฉด ๋ฌธ์ ์กฐ๊ฑด์ ์ด๊ธฐ ์ํ ๊ทธ๋๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฏ๋ก ์์ชฝ๊ณผ ์๋์ชฝ์ด ๋ฐ๋ค์ธ -2๋ก ๊ณ์ฐํ๋ ๊ฒ์ด ๋ง๋ค.
๋ฌผ | ||||||
2 | 4 => 2 | 5 | 3 | |||
3 | ๋ฌผ | 2 | 5 | 2 | ||
7 | 6 | 2 | 4 | |||
๊ทธ๋ฌ๋ฏ๋ก ๋งค๋ ๋ น๋ ๋น์ฐ์ ๊ณ์ฐํ ๋, ํ์ฌ ์ํ๋ฅผ ๋ณต์ฌํด๋๊ณ (cp_world) ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น์ฐ์ ๋ น๋ ์์ ๊ณ์ฐํ๋ค.
๊ตฌํ ์ธ์ด: Python
from collections import deque
from sys import stdin
import copy
# ๋น์ฐ์ ํ์ฌ ์์น๊ฐ ์ผ๋ง๋ ๋
น์ ์ง ๊ณ์ฐ
# ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ ์ค ๋ฌผ์ด ์๋ ๋ฉด์ ๊ฐ์๋ฅผ ์ฐพ๋๋ค.
def oceans(t_x, t_y):
ocean_cnt = 0
for k in range(4):
nx = t_x + mx[k]
ny = t_y + my[k]
# ๋ค ๋ฐฉํฅ ์ค ๋ฐ๋ค๋ฅผ ์ฐพ์ผ๋ฉด +1
if cp_world[nx][ny] == 0:
ocean_cnt += 1
return ocean_cnt
# ๋๋น ์ฐ์ ํ์์ ์ํํ๋ฉฐ ๋น์ฐ ๋ฉ์ด๋ฆฌ์ ๊ฐ์๋ฅผ ์ฐพ๋๋ค.
def bfs():
groups = 0 # ๋ฉ์ด๋ฆฌ ๊ฐ์
queue = deque()
visited = [[False] * m for _ in range(n)] # ๋ฐฉ๋ฌธ ์ฒดํฌ
for a in range(1, n-1):
for b in range(1, m-1):
# ์ด์ ์ ๋ฐฉ๋ฌธํ ์ ์๋ ๋น์ฐ์ ์ฐพ์์ ๋ ๊ฑฐ๊ธฐ์์ ๋ฉ์ด๋ฆฌ ํ์ ์์
if world[a][b] > 0 and not visited[a][b]:
groups += 1
queue.append((a, b)) # ์์์
visited[a][b] = True
# BFS ์์
while queue:
x, y = queue.popleft()
for c in range(4):
nx = x + mx[c]
ny = y + my[c]
# ๋ฒ์ ์์ ์๊ณ
if 1 <= nx < n-1 and 1 <= ny < m-1:
# ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๋น์ฐ์ ์ฐพ์ผ๋ฉด ๋ฉ์ด๋ฆฌ์ ํฌํจ
if world[nx][ny] > 0 and not visited[nx][ny]:
queue.append((nx, ny))
visited[nx][ny] = True
return groups
n, m = map(int, stdin.readline().rstrip().split())
world = [list(map(int, stdin.readline().rstrip().split())) for _ in range(n)]
# ์ ํ ์ข ์ฐ
mx = [-1, 1, 0, 0]
my = [0, 0, -1, 1]
year = 0 # ์๊ฐ
groups = 0 # ๋ฉ์ด๋ฆฌ ๊ฐ์
ice_exist = False # ๋น์ฐ์ด ์กด์ฌํ๋์ง ์ฒดํฌ
# ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ด ๋๋ฉด ์ข
๋ฃ
while groups < 2:
ice_exist = False
cp_world = copy.deepcopy(world)
# ๋น์ฐ์ ๋
น์ธ๋ค.(ํ
๋๋ฆฌ๋ ํญ์ ๋ฌผ์ด๋ค.)
for i in range(1, n-1):
for j in range(1, m-1):
# ๋น์ฐ์ ๋ฐ๊ฒฌํ๋ฉด
if world[i][j] > 0:
ice_exist = True
# ๋ฐ๋ท๋ฌผ๊ณผ ์ ํ ๋ถ๋ถ์ ์๋งํผ ๋
น๋๋ค.
melt = oceans(i, j)
if world[i][j] <= melt:
world[i][j] = 0
else:
world[i][j] -= melt
# ๋น์ฐ์ด ์์์ผ๋ฉด ๋ฐ๋ก ์ข
๋ฃ
if not ice_exist:
break
# 1๋
์ด ์ฆ๊ฐํ๋ค.
year += 1
# ๋น์ฐ์ ๋
น์ธ ํ ๋ฉ์ด๋ฆฌ ๊ฐ์๋ฅผ ์ธ๋ณธ๋ค.
groups = bfs()
# ๋ค ๋
น์ผ ๋๊น์ง ๋ฉ์ด๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋์ง ์๋๋ค๋ฉด 0์ ์ถ๋ ฅํ๋ค.
if not ice_exist and groups < 2:
print(0)
else:
print(year)
'Problem_Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 1920 ์ ์ฐพ๊ธฐ / ์ด๋ถํ์ (0) | 2021.02.09 |
---|---|
[BOJ] ๋ฐฑ์ค 9205 ๋งฅ์ฃผ ๋ง์๋ฉด์ ๊ฑธ์ด๊ฐ๊ธฐ / BFS (0) | 2021.02.08 |
[BOJ] ๋ฐฑ์ค 2468 ์์ ์์ญ / BFS (0) | 2021.01.13 |
[BOJ] ๋ฐฑ์ค 5014 ์คํํธ๋งํฌ / BFS (0) | 2021.01.13 |
[BOJ] ๋ฐฑ์ค 13549 ์จ๋ฐ๊ผญ์ง 3 / BFS (0) | 2021.01.12 |