문제 소개
철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자모양 상자의 칸에 하나씩 넣은 다음, 상자들을 수직으로 쌓아 올려서 창고에 보관한다.

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지 그 최소 일수를 알고 싶어 한다.
토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.
사용한 알고리즘
더보기
BFS
Code
# Python code
###########################################################
import sys
import collections
import itertools
import copy
input=sys.stdin.readline
sys.setrecursionlimit(10**7)
###########################################################
M , N , H = map(int,input().split())
MaxIter = max(M,N,H) + 1
Arr = []
Tomato_Q = collections.deque([])
zeroCount = 0
Tomato_zero = 0
for h in range(H):
arrayH = []
#arrayN = []
for n in range(N):
temp_ = list(map(int,input().split(" ")))
arrayH.append(temp_)
for m in range(M):
if temp_[m] == 1:
Tomato_Q.append([m, n, h])
elif temp_[m] == 0:
zeroCount += 1
Arr.append(arrayH)
# Arr[h][n][m]
dm = [-1,1,0,0,0,0]
dn = [0,0,1,-1,0,0]
dh = [0,0,0,0,1,-1]
Day = 0
while Tomato_Q:
Day += 1
for _ in range(len(Tomato_Q)):
start_m,start_n,start_h = Tomato_Q.popleft()
for i in range(6):
new_m = start_m + dm[i]
new_n = start_n + dn[i]
new_h = start_h + dh[i]
if 0<=new_m<M and 0<=new_n<N and 0<=new_h<H and Arr[new_h][new_n][new_m]==0:
Tomato_Q.append([new_m,new_n,new_h])
Tomato_zero += 1
Arr[new_h][new_n][new_m]=1
if Tomato_zero==zeroCount:
print(Day-1)
else :
print(-1)
반응형
'알고리즘 > 알고리즘 문제' 카테고리의 다른 글
| [백준-10451] 순열 사이클- Python (0) | 2022.03.05 |
|---|---|
| [백준-2331] 반복수열 - Python (0) | 2022.03.05 |
| [백준-9663] N-Queen - Python (0) | 2022.03.05 |
| [백준-4963] 섬의 개수 - Python (0) | 2021.12.08 |
| [백준-9205] 맥주 마시면서 걸어가기 - Python (0) | 2021.12.08 |