풀이
bfs로 구현
box = []를 하나의 판(?)이라고 생각하자.
이후 for문을 통해 box 안에 토마토의 가로 세로 배열이 들어간다.
만약 box[j][k] == 1
배열 안에 익은 토마토가 있다면 queue에 (i,j,k)값을 저장해준다.
이후, graph.append(box)
를 통해 박스가 graph에 append되어 3차원 배열이 만들어진다.
dx, dy, dz로 3차원 방향벡터를 만들어준다.
bfs()에서 반복문으로 방향벡터를 통해 방문하여 방문한 값(xx,yy,zz)이
graph 안에 있고, 해당 값이 0(익지 않은 토마토)라면 해당 값에 이전값+1(날짜)를 해준 뒤 queue에 append해준다.
이후 반복문을 통해 graph의 값을 꺼내보자.if k == 0:
만약 k 값이 0, 즉 안익은 토마토가 남아 있다면 -1을 출력해 주고 exit.day = max(day,(max(j)))
이전 day값과 max(day)를 비교하여 출력 해준다.
from collections import deque
import sys
input = sys.stdin.readline
graph = []
m,n,h = map(int, input().rsplit())
queue = deque()
for i in range(h):
box = []
for j in range(n):
box.append(list(map(int,input().split())))
for k in range(m):
if box[j][k] == 1:
queue.append([i,j,k]) # 높이 세로 가로
graph.append(box)
dx = [-1,1,0,0,0,0]
dy = [0,0,1,-1,0,0]
dz = [0,0,0,0,1,-1]
def bfs(queue):
while queue:
x,y,z = queue.popleft()
for way in range(6):
xx = x + dx[way] # 높이
yy = y + dy[way] # 세로
zz = z + dz[way] # 가로
if 0 <= xx < h and 0 <= yy < n and 0 <= zz < m and graph[xx][yy][zz]== 0:
graph[xx][yy][zz] = graph[x][y][z] + 1
queue.append((xx,yy,zz))
bfs(queue)
day = 0
for i in graph:
for j in i:
for k in j:
if k == 0:
print(-1)
exit(0)
day = max(day,(max(j)))
print(day-1)
'ProblemSolving > BFS' 카테고리의 다른 글
[Baekjoon] 2644 촌수계산 (0) | 2022.04.10 |
---|