[BaekJoon 7576 : DFS/BFS, Python] - 토마토 농장
2021, Oct 19
백준 토마토 농장 : 실버 1
Solution
import sys
from collections import deque
input = sys.stdin.readline
m, n = map(int, input().split())
tomato = []
for _ in range(n):
tomato.append(list(map(int, input().split())))
def bfs(dq):
global cnt
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)] # (c, r)
while dq:
cur_r, cur_c = dq.popleft()
for d in dirs:
nxt_c = cur_c + d[0]
nxt_r = cur_r + d[1]
if 0 <= nxt_c < m and 0 <= nxt_r < n and tomato[nxt_r][nxt_c] == 0:
tomato[nxt_r][nxt_c] = tomato[cur_r][cur_c] + 1
dq.append((nxt_r, nxt_c))
dq = deque()
for i in range(n):
for j in range(m):
if tomato[i][j] == 1:
dq.append((i, j)) # 1 인 토마토 정보는 미리 다 넣고 시작해야, '최소' 소요일을 구할 수 있다
bfs(dq)
for i in range(n):
if 0 in tomato[i]:
print(-1)
sys.exit(0)
ans = max(map(max, tomato))
if ans < 0: # 다 비어있는 상자(-1 밖에 없는 배열)
print(0)
else:
print(ans-1)
풀이과정 및 느낀점
대표적인 bfs를 이용한 구현 문제이다.
주의할 점은 토마토가 전부 익는 ‘최소’ 요일이기 때문에 1(익은 토마토)있는 좌표는 모두 먼저 deque 에 넣고 시작해야 한다는 점이다.
또 안 익은 토마토가 있는 경우와, 처음부터 토마토가 다 비어있는 경우는 다른 경우이기 때문에 이 부분도 출력에 주의해야 한다.