Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 7569 토마토

정글러 2021. 11. 20. 22:56
import sys
input = sys.stdin.readline
from collections import deque

n, m, h = map(int, input().split())
B = []
que = deque()
check = [[[False for i in range(n)] for j in range(m)] for k in range(h)]
for k in range(h) :
    B.append([])
    for j in range(m) :
        B[k].append(list(map(int, input().split())))
        for i in range(n) :
            t = B[k][j][i]
            if t == 1 :
                que.append([i, j, k])

dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]
while que :
    a, b, c = que.popleft()
    for i in range(6) :
        x = a + dx[i]
        y = b + dy[i]
        z = c + dz[i]
        if 0 <= x < n and 0 <= y < m and 0 <= z < h and B[z][y][x] == 0 and check[z][y][x] == False :
            check[z][y][x] = True
            B[z][y][x] = B[c][b][a] + 1
            que.append([x, y, z])
f = True
date = 0
for k in range(h) :
    for j in range(m) :
        for i in range(n) :
            if B[k][j][i] == 0 :
                f = False
            date = max(date, B[k][j][i] - 1)
if f :
    print(date)
else :
    print(-1)

dx와 dy를 써서 인접한 블록으로 확산되는 BFS에서 dz를 추가하여 3차원으로 확장한 코드이다.

토마토의 정보가 담긴 3차원 행렬를 인풋대로 작성하고, 익은 토마토는 큐에 넣는다.

인접한 블록이 안익은 토마토라면 익은 토마토의 값 + 1으로 값을 바꾸어 익은 날짜를 구분하고,

check라는 3차원 행렬을 만들어 큐에 담기는 순간 기록하여 큐에 중복으로 담기는 것을 방지한다.

 

토마토의 값이 익은 날짜 + 1이므로 (처음부터 익어있던 토마토가 1) 안익은 토마토가 없다면 max값을 출력한다.