[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 에 넣고 시작해야 한다는 점이다.
또 안 익은 토마토가 있는 경우와, 처음부터 토마토가 다 비어있는 경우는 다른 경우이기 때문에 이 부분도 출력에 주의해야 한다.