0. 문제 링크
https://www.acmicpc.net/problem/7569
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. 마무리
무난무난한 문제
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 1967 - 트리의 지름 (0) | 2023.03.11 |
---|---|
[백준 - Python] 2668 - 숫자 고르기 (0) | 2023.03.08 |
[백준 - Python] 2573 - 빙산 (0) | 2023.03.08 |
[백준 - Python] 19236 - 청소년 상어 (2) | 2023.03.08 |
[백준 - Python] 20061 - 모노미노도미노 2 (0) | 2023.03.08 |