
import sys
from collections import deque
input = sys.stdin.readline
def decision(res):
if res == "BFS":
BFS(table, data)
res = 0
for i in range(n):
for j in range(m):
if table[i][j] == 0:
return -1
res = max(table[i][j], res)
return res-1
else:
return 0
def BFS(table, data):
res = 0
q = deque([])
for t in data:
q.append(t)
while q:
x, y = q.popleft()
dx = [-1,1,0,0]
dy = [0,0,-1,1]
# 상하좌우
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if (0 <= nx < n) and (0 <= ny < m):
if table[nx][ny] == 0:
table[nx][ny] = table[x][y] + 1
res = max(table[nx][ny], res)
q.append((nx, ny))
return table
m, n = map(int, input().split())
table = [list(map(int, input().split())) for _ in range(n)]
data = []
res = False
for i in range(n):
for j in range(m):
if table[i][j] == 1:
data.append((i, j))
else:
res = "BFS"
print(decision(res))
이건 그냥 누가 봐도 BFS문제이다.
1. input을 받아서 n * m 테이블 만들기
2. 초기 table값 중에 익지 않은 토마토, 즉 0이 하나도 없다면 그냥 0을 출력하고 종료
3. 초기 table값 중 익은 토마토의 위치 정보를 data 리스트에 저장
4. BFS함수 - table과 data를 받아서 data를 양방향 큐로 바꿔주고 BFS 실행 (방문할 때마다 table값을 1씩 증가시킴)
5. decision함수 - table을 돌면서 0이 남아있으면 -1을 리턴하고 없으면 최댓값-1을 리턴

정답!