728x90
문제
https://www.acmicpc.net/problem/7569
풀이
BFS(너비 우선 탐색)를 사용해 풀었습니다.
- 6 방향(위, 아래, 상, 우, 하, 좌)을 미리 설정해 줍니다.
- 익은 토마토(1)의 위치를 모두 큐에 추가합니다.
- 익은 토마토를 주변으로 6 방향을 확인하며 익지 않은 토마토(0)를 익은 토마토(1)로 바꿔주고 바뀐 토마토 위치를 큐에 추가합니다.
- 시작 시점에 있던 큐를 모두 수행하면 하루가 지난 것이므로
L
에 1을 더합니다. - 마지막으로 익지 않은 토마토가 존재한다면
-1
을, 모두 익었다면L
을 출력합니다.
코드
파이썬
import sys
from collections import deque
input = sys.stdin.readline
M, N, H = map(int, input().split())
boxes = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)]
dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 0, 1, 0]
dz = [0, 0, 0, 1, 0, -1]
def BFS():
L = -1
queue = deque()
for i in range(H):
for j in range(N):
for k in range(M):
if boxes[i][j][k] == 1:
queue.append((i, j, k))
while queue:
for _ in range(len(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 boxes[nx][ny][nz] == 0
):
boxes[nx][ny][nz] = 1
queue.append((nx, ny, nz))
L += 1
for i in range(H):
for j in range(N):
for k in range(M):
if boxes[i][j][k] == 0:
return -1
return L
print(BFS())
728x90
'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글
[백준] 2206번: 벽 부수고 이동하기 (0) | 2023.05.11 |
---|---|
[백준] 1987번: 알파벳 (0) | 2023.05.11 |
[백준] 10026번: 적록색약 (0) | 2023.05.11 |
[백준] 1753번: 최단경로 (0) | 2023.05.11 |
[백준] 14500번: 테트로미노 (1) | 2023.05.10 |