https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
import sys
from collections import deque
input = sys.stdin.readline
m, n, h = map(int,input().split())
arr = [[list(map(int,input().split())) for _ in range(n)] for i in range(h)]
q = deque()
di = [-1,1,0,0,0,0]
dj = [0,0,-1,1,0,0]
dz = [0,0,0,0,-1,1]
def bfs():
while q: # 1인 곳들을 모두 순회할 때까지
z, i, j = q.popleft()
for k in range(6): # 1인곳 상하좌우앞뒤 탐색해서 +1 해서 익히기
ni, nj, nz = i + di[k], j + dj[k], z + dz[k]
if 0 <= ni < n and 0 <= nj < m and 0 <= nz < h:
if arr[nz][ni][nj] == 0:
arr[nz][ni][nj] = arr[z][i][j] + 1
q.append((nz,ni,nj)) # 순회해서 익힌 곳도 q에 집어넣기
for k in range(h):
for i in range(n):
for j in range(m):
if arr[k][i][j] == 1: # 맨처음, 1인 곳을 모두 q에 집어넣기
q.append((k,i,j))
bfs()
day = 0
for i in arr:
for j in i:
for s in j:
if s == 0:
print(-1)
exit() # 함수 강제종료
day = max(day, max(j)) # 리스트를 돌면서 최댓값 갱신
print(day-1) # 디폴트가 1이었으므로 -1해주기
Check Point
- 시간초과방지 1 : input = sys.stdin.readline -> 보기좋게 input 변수에 할당
- 시간초과방지 2 : from collections import deque -> pop(0)는 비효율적. popleft()사용
- 3차원 배열 -> x,y,z 세 델타값 설정(6)
- 코드 강제종료하는 exit() -> sys를 import해야만 사용가능!
- bfs를 돌려 visited을 따로 만들지 않고 며칠만에 익는지에 따라 1씩 누적합 해주면서 그 최댓값을 구함
'백준' 카테고리의 다른 글
백준 5014. 스타트링크 (0) | 2023.09.01 |
---|---|
백준 1697. 숨바꼭질 (0) | 2023.09.01 |
백준 2644. 촌수계산 (0) | 2023.08.29 |
백준 2667. 단지번호붙이기 (0) | 2023.08.29 |
백준 2606번. 바이러스 (0) | 2023.08.29 |