본문 바로가기
알고리즘

[백준] 7569번: 토마토 - python

by 육빔 2024. 4. 3.
728x90
반응형

https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

이번엔 3차원 배열에서의 토마토이다. 전 버전과 다른 곳은 

dx = [1, 0, -1, 0, 0, 0]
dy = [0, 1, 0, -1, 0 ,0]
dz = [0, 0, 0, 0, 1, -1]
 
이 부분을 제외하면 똑같은 코드이다. 아래는 전에 푼거에다가 3차원 리스트로 만든뒤 제작한 코드이다.
 
from collections import deque
m, n, h = map(int, input().split())
box = []

for _ in range(h):
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    box.append(arr)

cnt = 0
for z in range(h):
    for i in range(n):
        for j in range(m):
            if box[z][i][j] == 0:
                cnt+=1
if cnt == 0:
    print(0)
    exit()
dq = deque()
dx = [1, 0, -1, 0, 0, 0]
dy = [0, 1, 0, -1, 0 ,0]
dz = [0, 0, 0, 0, 1, -1]
s = 0
for z in range(h):
    for i in range(n):
        for j in range(m):
            if box[z][i][j] == 1:
                dq.append((z, i, j))
while dq:
    z, x, y = dq.popleft()
    for k in range(6):
        nx = dx[k] + x
        ny = dy[k] + y
        nz = dz[k] + z
        if 0<=nx<n and 0<=ny<m and 0<=nz<h:
            if box[nz][nx][ny] == 0:
                box[nz][nx][ny] = box[z][x][y] + 1
                dq.append((nz, nx, ny))
high = 0
for z in range(h):
    for i in range(n):
        for j in range(m):
            if box[z][i][j] == 0:
                print(-1)
                exit()
            high = max(high, box[z][i][j])  # 최대값을 갱신하는 방식으로 변경

# 모든 토마토가 익는 데 걸리는 최소 일수를 출력할 때, 초기값 1을 고려하여 1을 빼준다.
print(high-1)  # 모든 토마토가 익는 데 필요한 최소 일수 계산 시, 1을 빼줌

 

완성

728x90
반응형