코드

from collections import deque

m, n, h = map(int, input().split())

# 3차원 리스트로 생성
graph = [[list(map(int, input().split()))
            for _ in range(n)]
            for _ in range(h)]

# 방향 부여 (3차원이니까 3개)
dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]

q = deque()

# 가장 바깥 쪽에서부터
# graph[i][j][k] => i가 높이에 해당
for i in range(h):
    for j in range(n):
        for k in range(m):
            if graph[i][j][k] == 1:
                q.append((i, j, k))
                
def solution():
    while q:
        # i가 높이 => z가 높이
        # 순서 중요
        z, x, y = q.popleft()
        
        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]
            
            if (0 <= nx < n and 0 <= ny < m 
                and 0 <= nz < h):
                if graph[nz][nx][ny] == 0:
                    graph[nz][nx][ny] = graph[z][x][y] + 1
                    q.append((nz, nx, ny))
     
    # 최종 답안을 담을 변수
    answer = 0
    
    # 전체 박스 상자들을 층 => 각각 한 줄
    # 이 순서로 반복하여 탐색하면서
    # 0이 존재하면 -1 리턴
    # 0이 존재하지 않으면 가장 큰 값을 리턴
    # 가장 큰 값을 리턴하는 과정에서
    # 만약 처음부터 모두 익어있다면
    # 당연히 가장 큰 값은 1일 것이므로
    # 따로 고려해주지 않아도 된다
    for box in graph:
        for tot in box:
            if 0 in tot:
                return -1
            answer = max(answer, max(tot))
        
    return answer - 1

print(solution())            

문제 해설

토마토 1층짜리 문제

위 문제의 심화 버전이다. 단순하게 생각하면 2차원이었던 박스가 3차원이 되면서 상 하 좌 우 뿐만 아니라 3차원 상으로의 위 아래까지 고려하여야 하는 문제.


구현 자체는 1층짜리 문제와 거의 유사하나, 3차원 리스트를 생성하면서 각 좌표 값에 일치하는 변수를 순서에 맞게 for문으로 반복해주는 것이 생각보다 헷갈리므로 주의가 필요하다.


이런 문제는 사실상 처음 접하게 되면 막막할 수가 있는데 3차원으로도 대각선을 고려하지 않기 때문에 생각보다 수월하게 정답을 맞출 수 있다. 즉 결국 경험치다. 열심히 다양한 문제를 많이 풀어봐야겠다.

아래의 그림은 함수 마지막 for문에 관하여 이해가 쉽게 도울 수 있는 참고용이다.

for box in graph:
        for tot in box:
            if 0 in tot:
                return -1
            answer = max(answer, max(tot))

토마토

댓글남기기