알고리즘/백준[baekjoon]
[baekjoon] 백준 7569번 : 토마토 (by python) bfs 너비우선 탐색
코딩하는이씨
2022. 7. 1. 20:10
728x90
반응형
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
정답 code
#토마토
from collections import deque
import sys
input = sys.stdin.readline
dx = [-1,1,0,0,0,0]
dy = [0,0,-1,1,0,0]
dz = [0,0,0,0,-1,1]
queue = deque()
m , n , h = map(int,input().split())
box = []
for i in range(h):
tmp = []
for j in range(n):
tmp.append(list(map(int,input().split())))
for k in range(m):
if tmp[j][k] == 1:
queue.append([i,j,k])
box.append(tmp)
while queue:
x,y,z = queue.popleft()
for i in range(6):
a = x + dx[i]
b = y + dy[i]
c = z + dz[i]
if 0<= a < h and 0<= b < n and 0<= c < m and box[a][b][c]==0:
queue.append([a,b,c])
box[a][b][c] = box[x][y][z]+ 1
day = 0
for i in box:
for j in i:
for k in j:
if k == 0:
print(-1)
exit(0)
day = max(day,max(j))
print(day-1)
solution
처음엔 이중리스트를 통해 구현했다. n이 3이고 h가 2이면 [[],[],[],[],[],[]] 이런식으로 구현하여 n*h를 통해 원하는 위치를 찾았는데 너무 복잡하고 의미가 없었다.
그래서 다시 3중 리스트를 통해 구현했다.
바로 box [] 에 넣는것보다 tmp에 추가해 1이 있으면 queue에 추가해준다.
그후 n 만큼 추가되면 통채로 box에 넣어 한개의 층을 만들어준다.
이후에는 bfs가 실행되는데 queue에 익은토마토의 좌표가 들어있음으로 popleft를 통해 꺼내고
dx,dy,dz를 이용해 상하좌우에 있는 토마토가 익지 않았다면 +1한 값을 넣어준다.
3중 for문을 통해 익지않은 토마토가 아직 있다면 -1을 출력해주고
아니라면 box속의 최대값을 찾아준다음 익은토마토가 1부터 시작했음으로 -1을 한값이 걸린 날짜가 된다.
728x90
반응형