[백준] 7569번: 토마토 문제 풀이 파이썬

현톨·2022년 4월 14일
0

Algorithm

목록 보기
20/42

문제 링크

https://www.acmicpc.net/problem/7569

풀이 방식

  1. 기존 2차원 배열에서 하던 dfs를 3차원 배열에서 시도한다.
  2. 입력을 받을 때, 어느 좌표에 토마토가 있는지 확인하고, 큐에 삽입한다.
  3. 큐 안에 있는것들을 하나씩 dfs로 검사하면서 해당 값들을 하루씩 늘려준다.
  4. 마지막에 배열을 검사하여 0이 있으면 -1, 그렇지 않으면 가장 큰 날짜값을 리턴한다.

전체 코드

from sys import stdin
from collections import deque

M, N, H = map(int, input().split())
box = []
queue = deque([])

for i in range(H):
    floor = []
    for j in range(N):
        floor.append(list(map(int, stdin.readline().split())))
        for k in range(M):
            # 입력받은 값 중에 1이 있으면 queue에 넣어 검사 시작점으로 설정
            if floor[j][k] == 1:
                queue.append([i, j, k])
    box.append(floor)

dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]

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 box[nx][ny][nz] == 0:
            queue.append([nx, ny, nz])
            # 익은 토마토 주변 값들을 1씩 늘려준다
            # 하루씩 지나는 것을 표현
            box[nx][ny][nz] = box[x][y][z] + 1

cnt = 0
for i in box:
    for j in i:
        for k in j:
            if k == 0:
                # 박스에 익지않은 토마토가 있으면 -1
                print(-1)
                exit(0)
        # 박스를 검사하면서 가장 크게 지난 날짜를 비교
        cnt = max(cnt, max(j))
print(cnt - 1)
profile
기록하는 습관 들이기

0개의 댓글