개인공부/알고리즘
[백준] 7569번 토마토 (파이썬)
lsc99
2023. 12. 7. 11:36
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net

- BFS: 너비 우선 탐색으로 가까운 노드부터 차례로 순회하는 방식이다.
- DFS: 깊이 우선 탐색으로 한 노드의 자식노드가 없을때까지 탐색하고, 다시 올라가면서 탐색하는 방식이다.
import sys
from collections import deque
m, n, h = map(int, input().split())
matrix = [[list(map(int, sys.stdin.readline().split())) for _ in range(n)] for _ in range(h)]
visited = [[[False]*m for _ in range(n)] for _ in range(h)]
queue = deque()
dx = [-1,1,0,0,0,0]
dy = [0,0,-1,1,0,0]
dz = [0,0,0,0,-1,1]
answer = 0
def bfs():
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 nx < 0 or nx >= h or ny < 0 or ny >= n or nz < 0 or nz >= m:
continue
if matrix[nx][ny][nz] == 0 and visited[nx][ny][nz] == False:
queue.append((nx,ny,nz))
matrix[nx][ny][nz] = matrix[x][y][z] + 1
visited[nx][ny][nz] = True
# 모두 1이 아닐 경우
for a in range(h):
for b in range(n):
for c in range(m):
if matrix[a][b][c] == 1 and visited[a][b][c] == 0:
queue.append((a,b,c))
visited[a][b][c] = True
bfs()
# 토마토 확인
for a in matrix:
for b in a:
for c in b:
if c == 0:
print(-1)
exit(0)
answer = max(answer, max(b))
print(answer-1)
# 어차피 모두 1이라면 0이 출력된다.