Computer Science/알고리즘

[백준 - Python] 7569 - 토마토

바보1 2023. 3. 8. 17:03

0.  문제 링크

 

 

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net


1.  풀이 방법

 

 

음... 해당 문제는 매우 쉬웠다.

그냥 BFS를 하면 풀리는 문제다.

이때 익혀야 하는 토마토의 개수를 미리 세서, 그 개수만큼 되면 끝내게 했다.

만약 해당 갯수만큼 모두 채우지 못했는데, BFS가 끝나버리면 이는 모두 채우지 못하는 것이므로 -1을 반환하였다.


2.  코드

 

 

from collections import deque
import sys


def sol(dq : deque):
    global empty
    cnt = 1
    while dq:
        for _ in range(len(dq)):
            z, y, x = dq.popleft()
            for dz, dy, dx in dir:
                nz, ny, nx = z + dz, y + dy, x + dx
                if not (0 <= nz < h and 0 <= ny < n and 0 <= nx < m):
                    continue
                if maps[nz][ny][nx] == 0:       # 익지 않은 토마토라면
                    maps[nz][ny][nx] = 1        # 익힘
                    dq.append((nz, ny, nx))     # 덱에 넣음
                    empty -= 1      # 숫자를 하나씩 줄임

        if empty == 0:      # 0이라면 리턴함
            return cnt

        cnt += 1

    return -1


if __name__ == "__main__":
    input = sys.stdin.readline
    m, n, h = map(int, input().split())
    maps = [[[m for m in map(int, input().split())] for _ in range(n)] for _ in range(h)]
    dq = deque()

    dir = [[0, -1, 0], [0, 0, 1], [0, 1, 0], [0, 0, -1], [1, 0, 0], [-1, 0, 0]]
    empty = 0

    for i in range(h):
        for j in range(n):
            for k in range(m):
                match maps[i][j][k]:
                    case 0:
                        empty += 1      # 익지 않은 토마토의 개수를 셈
                    case 1:
                        dq.append((i, j, k))        # 덱에 넣음

    if empty == 0:
        print(0)
        exit(0)

    print(sol(dq))

3.  마무리

 

 

무난무난한 문제