너와!나의!알고!리즘!/백준

[백준 #7569, Python] 토마토

moongchi98 2021. 4. 6. 15:47

[풀이]

🍅두번쨑 토맛토맛토맛토.. 얘도 기존의 2차원 토마토처럼 bfs를 돌리는것 자체는 매우 간단했다. 그런데,,,! 예상치 못한 난관은 3차원을 저장하는 거였다 ㅠㅠㅠㅠ 처음에 생각했던건 기존 토마토의 위치를 정해주기 위해서 `tmp`라는 임시리스트를 만들어주고, 이걸 arr라는 list에 append하고, 마지막에 field라는 가장 큰 list에 append하면 3차원이 나온다! 했는데, arr가 2번씩 append되면서 제대로 입력이 성사되지 않았다. 

그냥 field에 기본 규격에 맞게 만들어 놓고, 해당하는 index에 tmp를 추가해주면 문제 해결이다.

 

from sys import stdin
from collections import deque
def bfs(zero_count):
    global max_d
    while tomato:
        z,y,x = tomato.popleft()
        for i in range(6):
            nz = z + dz[i]
            ny = y + dy[i]
            nx = x + dx[i]
            if 0<=nz<H and 0<=ny<N and 0<=nx<M and field[nz][ny][nx] == 0  :
                field[nz][ny][nx] = 1
                D[nz][ny][nx] = D[z][y][x] + 1
                if D[nz][ny][nx] > max_d:
                    max_d = D[nz][ny][nx]
                tomato.append((nz,ny,nx))
                zero_count -= 1
    return zero_count

M,N,H = map(int,stdin.readline().split())
field =[[] for _ in range(H)]
D =[[[0]*M for _ in range(N)] for _ in range(H)]
tomato = deque([])
zero_count = 0
max_d = 0
dy = [-1,1,0,0,0,0]
dx = [0,0,-1,1,0,0]
dz = [0,0,0,0,-1,1]
for z in range(H):
    for y in range(N):
        tmp = list(map(int,stdin.readline().split()))
        for x in range(M):
            if tmp[x] == 1:
                tomato.append((z,y,x))
            elif tmp[x] == 0:
                zero_count += 1
        field[z].append(tmp)
if zero_count == 0:
    answer = 0
else:
    zero = bfs(zero_count)
    if zero == 0:
        answer = max_d
    else:
        answer = -1
print(answer)