[백준 BOJ_7576] 토마토 Python 풀이

출처: 백준 온라인 저지

문제

image image image

풀이

BFS를 이용하여 풀어주었습니다.

시작하기 전 익지 않은 토마토의 수를 세어주어 cnt에 저장해주었습니다. 익지 않은 토마토가 없다면 바로 0을 출력하게 했습니다. 또한 세어줄 때 익은 토마토의 좌표를 queue에 담아주었고, 익지 않은 토마토가 있다면 BFS를 돌아주는 방식으로 풀었습니다.

새로 익는 토마토 좌표에(box[ny][nx]) 익은 토마토 좌표(box[y][x]) 값에 1을 더한 값으로 계속 누적해주어 일수를 체크해주었습니다. queue에 새롭게 익은 토마토 좌표를 넣어줄 때 cnt 수도 감소 시켜주어 후에 토마토가 모두 익지 못하는 상황도 체크할 수 있게 하였습니다.

토마토가 모두 익었을 때(cnt == 0)는 box를 돌아주어 가장 큰 값의 1을 뺀 값이 최소 일수가 됩니다. 처음부터 이미 익은 토마토의 값(1)에 1을 더한 값으로 계속 누적해주었기 때문에 실제 최소 일수보다 하루 더 큰 값이 저장되기 때문입니다.

코드

from collections import deque

M, N = map(int, input().split())
box = [list(map(int, input().split())) for _ in range(N)]
queue = deque()

dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]

result = -1
cnt = 0
for i in range(N):
  for j in range(M):
    if box[i][j] == 1:
      queue.append((i, j))
    elif box[i][j] == 0:
      cnt += 1

if cnt:    
  while queue:
    y, x = queue.popleft()
    if not cnt:
      break
    for i in range(4):
      ny, nx = y+dy[i], x+dx[i]
      if 0 <= ny < N and 0 <= nx < M and box[ny][nx] == 0:
        box[ny][nx] = box[y][x] + 1
        queue.append((ny, nx))
        cnt -= 1
  if not cnt:
    for i in range(N):
      result = max(result, max(box[i]))
    result -= 1
  # print(*box, sep="\n")
  print(result)
else:
  print(0)

Leave a comment