๋ฐฑ์ค 2636๋ฒ
https://www.acmicpc.net/problem/2636
๋ฌธ์
ํ๊ธฐ
์๋นํ ํ๋ค์๋ค. ์ฐ์ ๋ฐ๊นฅ ๊ณต๊ธฐ์ ์น์ฆ ์์ชฝ ๊ณต๊ธฐํ๋ณ์ ์ํ ์๊ฐ์ ๋ ์ฌ๋ฆฌ๋ ๋ฐ ์๊ฐ์ ํ์ฐธ ์๋ชจํ๋ค.
์ด๋ DFS๋ฅผ ๋๋ฉฐ ์น์ฆ์ ์ํ์ข์ฐ์ ๋ฐ๊นฅ ๊ณต๊ธฐ๊ฐ ํ๋๋ผ๋ ๋ฟ์ ์์ผ๋ฉด 1์๊ฐ ๋ค์ ๋ น๋๋ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค.
์ด ๊ณผ์ ์์ DFS ์์์ ๋ฌดํ๋ฃจํ๊ฐ ์ผ์ด๋, ํด๊ฒฐ์ ์ํ ์๊ฐ์ ํ์ฐธ ํ๋๋ฐ, ๊ฒฐ๋ก ์ While ์์์ ํ ๋ฒ ๋ ๊ทธ๋ํ ์ ์ฒด๋ฅผ ๋๋ฉฐ ์ด๊ธฐํํ๋ ๊ฒ์ด๋ค. ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ, ์๊ฐ์ด ์์๋์ง๋ง, ์์ง์ ๋์ ์ค๋ ฅ์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค.
์ฒ์์ ์ฝ๋๊ฐ ์ํ๋ ๋๋ก ์คํ๋์ง ์์ ๋ฌด์์ด ๊ณ์ ๋ฌธ์ ์ผ๊น ๋ผ๋ ์๊ฐ์ ์ ๋ง ๋ง์ด ํ๋ค.
๋ฌธ์ ์ ์ check_cheese์ remove_cheese์์ ๋ฌดํ๋ฃจํ๊ฐ ๊ณ์ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
๊ทธ๋ํ์ DFS , BFS์ ๋ํ ๊ฐ๋
์ด ์๋ฒฝํ์ง ์๋ค๋ฉด, ํจ์ ์ค๊ฐ์ print(graph) ๋ฑ์ ์
๋ ฅํ์ฌ ์ด๋ ๋ถ๋ถ์์
์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ๋ณด๋ฉด์ ์ฝ๋๋ฅผ ๊ณ ์ณ๊ฐ ๋๋ถ์ ํด๊ฒฐํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
์ถํ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ค์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ณผ ์์
๋์ ํ์ด
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**7)
n, m = map(int,input().split())
graph= []
for i in range(n):
graph.append(list(map(int,input().split())))
visited= [ [False] * m for _ in range(n)]
# ํ์ด์์ cheese์ ์์ ์ฒดํฌํด์ 0์ด ์๋๋ฉด ๋ฐ๋ณต์คํ
# ๋ฐ๊นฅ์ ์๋ ๊ณต๊ธฐ๋ค์ ์ฐ์ 9๋ก ์ ๋ถ ๋ฐ๊พธ๊ณ ( ๋ฐ๊นฅ๊ณต๊ธฐ ์์ชฝ๊ณต๊ธฐ ํ๋ณ )
# 9์ ์ ํด์๋ ์น์ฆ๋ค์ ๋ชจ๋ ๋
น์ธ๋ค.
# ํ๋ฒ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. time์ 1 ์ฆ๊ฐ์ํจ๋ค. ํ์ฌ ๋จ์ ์น์ฆ์ ์์ ์ ์ฅํ๋ค.
# visited๋ฅผ ์ด๊ธฐํํ๊ณ , ๋ฐ๋ณตํ๋ค.
def check_cheese(x,y): # ๊ณต๊ธฐ๊ฐ ๋ฐ๊นฅ๊ณต๊ธฐ ์ธ์ง ํ๋ณํ๋ ํจ์
if x<=-1 or x>=n or y<=-1 or y>=m :
return False
if not visited[x][y] and (graph[x][y] ==0 or graph[x][y]==9):
graph[x][y] = 10 #๋ฌดํ๋ฃจํ๋ฅผ ๋์ง์๊ธฐ ์ํด ์ผ๋จ 10์ผ๋ก ๋ง๋ค์ด ๋๊ณ
check_cheese(x,y-1)
check_cheese(x,y+1)
check_cheese(x+1,y)
check_cheese(x-1,y)
return True
return False
def remove_cheese(x,y): #์น์ฆ๊ฐ ๋ฐ๊นฅ ๊ณต๊ธฐ์ ๋ฟ์์๋์ง ํ๋ณํ๋ ํจ์
global cnt
if x<=-1 or x>=n or y<=-1 or y>=m:
return False
if not visited[x][y] and graph[x][y] == 1 and (graph[x][y-1] == 9 or graph[x][y+1] ==9 or graph[x-1][y] == 9 or graph[x+1][y] ==9 ): #์น์ฆ์ด๋ฉด์, ์ํ์ข์ฐ ๊ณต๊ธฐ์ ์ ํด์๋ค๋ฉด
graph[x][y] = -3 #๊ณง ๋
น์์์ ์ด๋ผ๋ ํ์
cnt +=1 #๋
น์ ์น์ฆ์ ์์ด๋ค.
return True
return False
cheese = 0 #์ ์ฒด์น์ฆ์์
now_cheese = [] #ํ์ฌ ์น์ฆ์ ์์ ์ ์ฅํ ๋ฆฌ์คํธ
time = 0 #์น์ฆ๋ฅผ ๋
น์ด๋๋ฐ ๊ฑธ๋ฆด์๊ฐ
#์น์ฆ์ ์์ ๊ทธ๋ํ๋ฅผ ๋๋ฉฐ ๊ตฌํ๋ค. ์ ์ฒด ์น์ฆ์ ์์ ๊ตฌํด์ผ ์น์ฆ๊ฐ 0์ด ๋์ ๋ ํจ์๋ฅผ ์ข
๋ฃํ ์ ์๊ธฐ ๋๋ฌธ
for i in range(n):
for j in range(m):
if graph[i][j] == 1:
cheese+=1
while True: #์น์ฆ๊ฐ 0์ด ๋๊ธฐ ์ ๊น์ง ๊ณ์ ๋์์
if cheese ==0:
print(time)
print(now_cheese[-1])
exit()
check_cheese(0,0)
#graph๋ฅผ ๋๋ฉด์ 10์ผ๋ก ๋ง๋ค์ด ๋์๋ ๊ณต๊ธฐ๋ค์ ๋ฐ๊นฅ ๊ณต๊ธฐ์ธ 9๋ก ๋ง๋ ๋ค. ๋ฌดํloop๋ฅผ ๋์ง์๊ธฐ์ํ ์์
for i in range(n):
for j in range(m):
if graph[i][j]==10:
graph[i][j] = 9
visited= [ [False] * m for _ in range(n)] #๋ฐ๊นฅ ๊ณต๊ธฐ๋ฅผ ๋๋ฉฐ visited๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์ด๊ธฐํ๋ฅผ ํด์ค๋ค.
cnt = 0 #์น์ฆ๊ฐ ๋ช๊ฐ ๋
น์ ์์ ์ธ์ง๋ ์ด๊ธฐํ
now_cheese.append(cheese) #ํ์ฌ ์น์ฆ์ ๊ฐ์ ๋ฆฌ์คํธ์ ์ ์ฅํด ๋์ด์ผ ๋ฌธ์ ์์ ์๊ตฌํ "ํ ์๊ฐ ์ ์ ๋จ์์๋ ์น์ฆ์ ๊ฐ์" ๋ฅผ ์ถ๋ ฅ๊ฐ๋ฅ
for i in range(n):
for j in range(m):
if not visited[i][j]:
remove_cheese(i,j) #์น์ฆ๋ฅผ ์ ๊ฑฐํ ์ค๋น
cheese -= cnt
for i in range(n):
for j in range(m):
if graph[i][j]==-3:
graph[i][j] = 9 #์น์ฆ๊ฐ ๋
น์๋ค
time +=1 # ๋ชจ๋ ์์
์ด ๋๋ฌ์ผ๋ 1์๊ฐ ๊ฒฝ๊ณผํ๋ค.