[백준 BFS] 토마토2(python)

11501 단어 백준백준

문제

https://www.acmicpc.net/problem/7569

나의 코드

"""
1. 아이디어
3차원 구조이므로 방향벡터를 잘 설정해줘야 한다.
그리고 bfs내에서는 주변 토마토를 익었다고 표시하기 위해 +1을 계속 해주면 시간을 표시할 수 있다.


2. 시간복잡도
O(N^3)인것 같은데 BFS의 시간복잡도 보다는 마지막 출력 부분에서 2중 for문과 max연산으로 인해
O(N^3)이 걸리는거 같다???????
"""

from collections import deque
from sys import stdin
input = stdin.readline

n, m, h = map(int, input().split())
map = [ [list(map(int, input().split())) for _ in range(m)] for _ in range(h) ]

# 3차원의 방향벡터
dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]

q = deque()
for i in range(h):
    for j in range(m):
        for k in range(n):
            if map[i][j][k] == 1:
                q.append((i, j, k))

while q:
    pz, px, py = q.popleft()

    for k in range(6):
        mz = pz + dz[k]
        mx = px + dx[k]
        my = py + dy[k]

        if 0 <= mz < h and 0 <= mx < m and 0 <= my < n:
            if map[mz][mx][my] == 0:
                map[mz][mx][my] = map[pz][px][py] + 1
                q.append((mz, mx, my))

time = 1
unripe_tomato = 0
for i in map:
    for j in i:
        unripe_tomato += j.count(0) # 0이 있다는거는 곧 안익은 토마토가 남아있다는 말.
        time = max(time, max(j)) # 익어가면서 더해줬던 시간의 마지막 시간을 구해야 한다.

if unripe_tomato: # 안 익은 토마토가 아직 남아있으면 -1 출력
    print(-1)
else:
    if time == 1: # 시간이 바뀌지 않았다면 bfs탐색을 안했다는 뜻이므로 0 출력
        print(0)
    else: # bfs 내에서 처음 1에서 시작하면서 시간을 계속 더해줬으므로 출력할때 -1 해줘야함.
        print(time-1)
    

느낀점

3차원으로 생각해야 해서 살짝 헷갈렸던 문제.
그리고 출력 부분에서 좀 에러였다. 다시 한번 볼 필요가 있음

좋은 웹페이지 즐겨찾기