어제 해결했던(물론 새벽이라 몇시간 안되었지만 자고 일어나면 그 다음날이라 가정한다.) BFS 문제와 유사하지만 조금 더 조건이 추가된 문항이였다. 사실 이 문항이 왜 골드5인지에 대해서 고민이 든다. 확실히 어제 풀었던 토마토 문항보다는 더 어려웠다. 어제 풀었던 문제와 유사해보여서 처음에는 동일한 2차원 배열로 처리하기 위해 M씩 늘어나면 층 수가 바뀐다는 논리를 대입했었다. 하지만 그러면 내가 무슨 층에 있는지를 통해서 이게 상자 모서리쪽에 있는건지 아니면 내가 다른 층으로 접근하는지에 대해서 케이스를 나눠놔야 한다는 문제가 발생하였다. 그렇다보니 이건 안되겠다는 생각이 들어서 그냥 3차원 배열로 문젤르 해결하였다.
import sys
from collections import deque
M, N, H = map(int, sys.stdin.readline().split())
dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]
arr = [[list(map(int, sys.stdin.readline().split())) for _ in range(N)] for _ in range(H)]
queue = deque()
for i in range(H):
for j in range(N):
for k in range(M):
if arr[i][j][k] == 1:
queue.append([i, j, k])
ans = 0
while queue:
z, y, x= queue.popleft()
for i in range(6):
xx = x + dx[i]
yy = y + dy[i]
zz = z + dz[i]
if 0 <= xx < M and 0 <= yy < N and 0 <= zz < H:
if arr[zz][yy][xx] == 0:
arr[zz][yy][xx] = arr[z][y][x] + 1
queue.append([zz, yy, xx])
ans = max(ans, arr[zz][yy][xx])
for k in range(H):
for i in range(N):
for j in range(M):
if arr[k][i][j] == 0:
print(-1)
exit()
if ans != 0:
print(ans - 1)
else:
print(ans)