백준 7569번 바로가기

나의 풀이

from collections import deque

# 입력
m,n,h=map(int,input().split())
tomato = []
for i in range(h):
  tomato.append([list(map(int,input().split())) for _ in range(n)])
queue = deque([])  
dx = [-1,1,0,0,0,0]
dy = [0,0,-1,1,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 tomato[i][j][k] == 1:
        queue.append([i,j,k])

def ripe():
  while queue:
    x,y,z = queue.popleft()
    
    for i in range(6):
      nx = x + dx[i]
      ny = y + dy[i]
      nz = z + dz[i]

      if 0<=nx<h and 0<=ny<n and 0<=nz<m and tomato[nx][ny][nz] == 0:
        tomato[nx][ny][nz] = tomato[x][y][z] + 1
        queue.append([nx,ny,nz])

ripe()
ans = 0
for t1 in tomato:
  for t2 in t1:
    for t3 in t2:
      if t3 == 0:
        print(-1)
        exit(0)
    ans = max(ans ,max(t2))
print(ans-1)

CODE REVIEW

  1. 7569번 토마토의 3차원 버전. 기본 원리는 동일해서 조금만 수정하면 금세 구현할 수 있다.
  2. 이 문제도 마지막에 3차원 array에서 최댓값을 구하는 과정이 까다로웠는데, 3차원은 한번에 최댓값을 구할 수 없다.
    • ans = max(ans,max(t2))와 같이 3차원 배열을 2차원들로 쪼개서 각각의 max값을 비교해서 더 큰 값으로 업데이트 하는 방법으로 구할 수 있다.