๐งฉ๋ฌธ์ ํด์
์ด์ ์ด๋ฐ ๋ฌธ์ ๋ค์ ๋ฑ ๋ณด๋ฉด ๊ทธ๋ํ ๊ด๋ จ ๋ฌธ์ ๋ผ๋ ๊ฑธ ๋ฐ๋ก ์์์ฐจ๋ฆด ์ ์๊ฒ ๋์๋ค.
'๋น์ฐ ํ ๋ฉ์ด๊ฐ ์ฃผ์ด์ก์ ๋'๊ฐ ์กฐ๊ฑด์ ๋ค์ด๊ฐ์์ผ๋, ๋ฌด์กฐ๊ฑด ๋น์ฐ์ ์ฃผ์ด์ง๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋น์ฐ์์ ์ผ์์ ์์น์ ๊ทธ ์ผ์ ์ฃผ์ ํ๊ฒฝ์ ์ดํผ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ฐ์ด ์ชผ๊ฐ์ก๋์ง BFS๋ฅผ ํตํด ํ์ธํ๋ค.
๐ ํ์ด ์ ์ก๋ด
์์ ๋งํ ๋ฌธ์ ํด์์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํด๋ด๋๋ฐ์๋ ์ฑ๊ณตํ๋ค.
์ฒซ๋ฒ์งธ ์ ์ถ์๋ ๋ฐํ์ ์๋ฌ(RecursionError)๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ์ฌ๊ทํจ์๊ฐ ๋๋ฌด ๊น์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
์ด๋ ๋นํฉํ์ง ๋ง๊ณ sys ๋ชจ๋์ ๋ถ๋ฌ์ sys.setrecursionlimit(n) ์ ์ ์ด์ฃผ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ n์ ์ต๋ ๊น์ด๋ฅผ ์๋ฏธํ๋ค.
sys.setrecursionlimit(10**4) ์ ๋ฃ์ด์ค์ผ๋ก์จ ๋ฐํ์ ์๋ฌ๋ฅผ ํด๊ฒฐํ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์๋ค..
์๊ฐํด๋ธ ์๊ณ ๋ฆฌ์ฆ์๋ ๋ฌธ์ ๊ฐ ์์ด๋ณด์๊ธฐ์ ์ง๋ฌธ ๊ฒ์ ํญ์ ๋ค์ด๊ฐ์ ์ง๋ฌธ๋ค์ ์ดํผ๋ ๋์ค pypy์ python ๋์ ๊ดํ ์ ๋ตํ์ ๊ธ์ ๋ณด์๋ค. ๊ทธ๋์ ์ฝ๋ ์์ ์์ด python์ pypy๋ก ์ ์ถํ์๋๋ ์ ๋ตํ์ ๋ฐ์๋ค..ใ ใ
์ดํ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ดํด๋ณด๋, ํ์ด์ฌ์ผ๋ก ์ ๋ตํ์ ๋ฐ์ ์ฝ๋๋ค์ ๋ฌผ์ ์์น๋ฅผ ๋งค๋ฒ ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ์ ์ฅํด๋์ด์ ์๊ฐ์ ์ ์ฝํ์๋ค.
๐ ํ์ด
์ผ์์ธ ๊ณณ์ ์ฐพ๊ณ , ๊ทธ ์ฃผ์์ ๋ฌผ์ ๊ฐฏ์๋ฅผ ์ฒดํฌํ์ฌ ์ผ์์ ๋ น์ฌ์ฃผ์๋ค.
์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณตํ์๋๋ฐ, ๋ฐ๋ณตํ ๋๋ง๋ค ๋น์ฐ์ด ๋ ์ด์์ผ๋ก ์ชผ๊ฐ์ก๋์ง BFS๋ก ํ์ธํด์ฃผ๊ณ , ์ชผ๊ฐ์ก๋ค๋ฉด ๋ฐ๋ณตํ์๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฐ์ด ๋ค ๋ น์ ๋๊น์ง ์์ง ๋น์ฐ์ด ๋ ์ด์์ผ๋ก ์ชผ๊ฐ์ง์ง ์์๋ค๋ฉด, ํ์ฌ ๋น์ฐ์ ์ ๋ถ 0์ด๋ผ๋ ์๋ฏธ์ด๋ค. ์ด ๊ฒฝ์ฐ๋ ์ฒดํฌํ์ฌ 0์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋์๋ค.
๐ป ์ฝ๋
import sys
sys.setrecursionlimit(10**4)
input = sys.stdin.readline
# ์ํ์ข์ฐ๋ก ์ผ์ ์ดํ ์ขํ
dx = [1,-1,0,0]
dy = [0,0,1,-1]
n,m = map(int,input().rstrip().split())
# ์ผ์๊ณผ ๋ฌผ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
ice = [list(map(int, input().rstrip().split())) for i in range(n)]
# ํ๋ฒ ๋
น์ ๋น์ฐ์ ์ ์ ์ ์ฅํด์ค ๋ฆฌ์คํธ
new = [[0 for i in range(m)] for i in range(n)]
# ๋น์ฐ์ด ๋ ์ด์์ผ๋ก ๋๋์ด์ก๋์ง ํ์ํ๋ ํจ์
def dfs(x,y):
if x <= -1 or y <= -1 or x >= n or y >= m:
return False
if ice[x][y] >0: # ๋ฐ๋ท๋ฌผ์ด ์๋ ๋น์ฐ์ด๋ผ๋ฉด
ice[x][y] = 0 # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
# ์ํ์ข์ฐ๋ก DFS ๋๋ฆฐ๋ค.
dfs(x,y-1)
dfs(x,y+1)
dfs(x+1,y)
dfs(x-1,y)
return True
return False
year = 0 # ์ฐ๋ ์นด์ดํธ
while True:
no = 0 # ๋ ์ด์์ผ๋ก ์ชผ๊ฐ์ง์ง ์๊ณ ์ ๋ถ ๋
น๋ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํ๊ธฐ ์ํ ๋ณ์
for i in range(n):
for j in range(m):
if ice[i][j] > 0: # ์ผ์์ด๋ผ๋ฉด
cnt = 0
for k in range(4):
# ์ํ์ข์ฐ ๋ค๊ตฐ๋ฐ๊ฐ ์ผ์์ธ์ง ๋ฐ๋ท๋ฌผ์ธ์ง ์ฒดํฌ
nx = i + dx[k]
ny = j + dy[k]
if nx <= -1 or ny <= -1 or nx >= n or ny >= m: # ๋ฒ์ด๋๋ ๊ฒฝ์ฐ ์ปจํฐ๋ด
continue
if ice[nx][ny] == 0: # ๋ฐ๋ท๋ฌผ์ด๋ผ๋ฉด ์นด์ดํธ ์ฌ๋ ค์ค
cnt += 1
# ์ด์ ํ์ฌ ๋น์ฐ์ ๋
น์ฌ์ค๋ค.
# if ๋ฌธ ์ฌ์ฉํ ์ด์ ๋ ์์๊ฐ ๋์ง ์๊ฒ ํ๊ธฐ ์ํด์
if ice[i][j] - cnt >= 0:
new[i][j] = ice[i][j] - cnt
else:
new[i][j] = 0
else: # ๋ฐ๋ท๋ฌผ์ด๋ผ๋ฉด
no += 1 # no ์นด์ดํธ๋ฅผ ์ฌ๋ ค์ฃผ๊ณ
# ์ ๋ถ ๋ฐ๋ท๋ฌผ์ด๋ผ๋ฉด 0 ์ถ๋ ฅ ํ ์ข
๋ฃ
if no == n*m:
print(0)
break
# ๋๋ก ์ชผ๊ฐ์ก๋์ง ์ฒดํฌํ๊ธฐ ์ํด DFS ํจ์๋ฅผ ํธ์ถํ๋ค.
result = 0
for i in range(n):
for j in range(m):
if dfs(i,j) == True:
result += 1
if result >= 2: # ๋ ์ด์ ์ชผ๊ฐ์ก๋ค๋ฉด year ์ถ๋ ฅํ๊ณ ์ข
๋ฃ
print(year)
break
year += 1
# ๋น์ฐ ์ ๋ณด ์
๋ฐ์ดํธ
ice = new
new = [[0 for i in range(m)] for i in range(n)]
๐ ๋ฌธ์ ๋งํฌ : ๋น์ฐ
'Problem Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 5014๋ฒ: ์คํํธ๋งํฌ - ํ์ด์ฌ (0) | 2022.06.01 |
---|---|
[๋ฐฑ์ค] 7562๋ฒ: ๋์ดํธ์ ์ด๋ - ํ์ด์ฌ (0) | 2022.05.31 |
[๋ฐฑ์ค] 2502๋ฒ: ๋ก ๋จน๋ ํธ๋์ด (0) | 2022.05.26 |
[๋ฐฑ์ค] 1654๋ฒ: ๋์ ์๋ฅด๊ธฐ - ํ์ด์ฌ (0) | 2022.05.23 |
[๋ฐฑ์ค] 25192๋ฒ: ์ธ์ฌ์ฑ ๋ฐ์ ๊ณฐ๊ณฐ์ด - ํ์ด์ฌ (0) | 2022.05.22 |