[백준] 7576번 토마토

정기홍·2024년 12월 31일
0

코딩테스트_파이썬

목록 보기
48/49

문제


입력

  • 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

  • 토마토가 하나 이상 있는 경우만 입력으로 주어진다.


출력

  • 여러분은 토마토가 모두 익을 때까지의 최소 날짜를 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.

풀이

# [백준] 7576번 토마토
from collections import deque
import sys

input = sys.stdin.readline

n,m = map(int,input().split())

array = []
for _ in range(m):
    array.append(list(map(int,input().split())))
dx = [0,0,-1,1]
dy = [-1,1,0,0]

q= deque()

def bfs():
    while q:
        ax, ay = q.popleft()
        for i in range(4):
            nx = ax + dx[i]
            ny = ay + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if array[ny][nx] == 0: 
                    array[ny][nx] = array[ay][ax] + 1
                    q.append([nx,ny])

for x in range(n):
    for y in range(m):
        if array[y][x] == 1:
            q.append([x,y])

bfs()

day = 0

for line in array:
    for item in line:
        if not item:
            print(-1)
            exit()
    day = max(day, max(line))

print(day-1)

후기

  • 좀 더 다양한 방식으로 많이 풀어보는 게 정답일거라고 생각이 든다.
profile
하나를 알고 그걸로 모든걸 관통한다.

0개의 댓글