백준 7569 토마토 Python

Derhon·2023년 11월 18일
0
post-thumbnail

백준 7569 토마토

나의 답

import sys
from collections import deque

X, Y, Z = list(map(int, sys.stdin.readline().rstrip().split()))
graph = [[[i for i in list(map(int, sys.stdin.readline().rstrip().split()))] for _ in range(Y)] for _ in range(Z)]

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

q = deque()
perfect = True

for z in range(Z):
    for y in range(Y):
        for x in range(X):
            if graph[z][y][x] == 1:
                q.append((z, y, x))
            if graph[z][y][x] == 0:
                perfect = False

day = 0
while q:
    prev_z, prev_y, prev_x = q.popleft()
    for i in range(6):
        next_z, next_y, next_x = prev_z + dz[i], prev_y + dy[i], prev_x + dx[i]
        if 0 <= next_z < Z and 0 <= next_y < Y and 0 <= next_x < X:
            if graph[next_z][next_y][next_x] == 0:
                new_day = graph[prev_z][prev_y][prev_x] + 1
                q.append((next_z, next_y, next_x))
                graph[next_z][next_y][next_x] = new_day
                day = new_day

error = False
for z in range(Z):
    if error: break
    for y in range(Y):
        if error: break
        for x in range(X):
            if graph[z][y][x] == 0:
                error = True
if perfect:
    print(0)
elif error:
    print(-1)
else:
    print(day - 1)

생각

3차원 배열이라... 코드 쓰면서 이게 맞나 싶은 점들이 있었다.
우선 촌수 계산 문제처럼 방문 노드가 이전 노드에서 몇 번째 멀어진건지를 계산했는데, +1씩 하다보니까 기존에 1로 되어있던 놈들때문에 어쩔수없이 -1을 해줬다.

그러다보니 처음부터 다 익어있는 애들이 -1로 표기되는 문제가 있었고, 결국 res 리스트를 추가해서 검사할까, 아니면 처음에 그냥 다 익어있는 애들에 대한 플래그를 세울까 하다가 후자로 선택했다.

3차원 배열만 아니었으면 크게 어려운 문제는 아니었던 것 같다..!

profile
🧑‍🚀 이사했어요 ⮕ https://99uulog.tistory.com/

0개의 댓글