💡 3차원 BFS를 익혀보자


import sys
from collections import deque
input = sys.stdin.readline
M, N, H = map(int,input().rstrip().split(' '))
visited = [[[False] * M for _ in range(N)] for _ in range(H)]
graph = [[list(map(int,input().rstrip().split(' '))) for _ in range(N)] for _ in range(H)]
dq = deque()
dx = [0,0,-1,1,0,0]
dy = [1,-1,0,0,0,0]
dz = [0,0,0,0,1,-1]
for i in range(H):
for j in range(N):
for k in range(M):
if graph[i][j][k] == 1 and visited[i][j][k] is False:
dq.append((k,j,i))
visited[i][j][k] = True
def bfs():
while dq:
x, y, z = dq.popleft()
for idx in range(6):
nx = x + dx[idx]
ny = y + dy[idx]
nz = z + dz[idx]
if 0 <= nx < M and 0 <= ny < N and 0 <= nz < H and graph[nz][ny][nx] == 0 and visited[nz][ny][nx] is False:
dq.append((nx,ny,nz))
graph[nz][ny][nx] = graph[z][y][x] + 1
visited[nz][ny][nx] = True
bfs()
day = 0
for q in graph:
for p in q:
if 0 in p:
print(-1)
exit()
else:
day = max(day, max(p))
print(day-1)
- 위 문제는 앞선 토마토 문제와 거의 동일한 문제이다.
- 다만 앞선 문제와는 달리 x,y,z까지 고려를 해야한다는 점이다.
- 풀이방식은 기존 토마토 문제와 아주 동일하다. 제일 먼저 익은 토마토를 dq안에 넣고 확장해가는 동일한 방식을 사용하였다.
- 다만 조금의 차이점이라면, 기존 2차원과 다르게 3차원이다보니 ,dx,dy,dz까지 필요하다는 점이였고, 각 요소의 갯수가 6개가 된다는 점이였더.
- 그 외에 추가적으로, 한줄 코딩을 이용해서 for문 3개를 이용한 입력값 받기를 한줄로 선언했다.
graph = [[list(map(int,input().rstrip().split(' '))) for _ in range(N)] for _ in range(H)]