백준 7569 - 토마토 (Python3)
코드
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())
문제 해설
위 문제의 심화 버전이다. 단순하게 생각하면 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))
댓글남기기