[백준 BFS] 토마토2(python)
문제
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)
느낀점
"""
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차원으로 생각해야 해서 살짝 헷갈렸던 문제.
그리고 출력 부분에서 좀 에러였다. 다시 한번 볼 필요가 있음
Author And Source
이 문제에 관하여([백준 BFS] 토마토2(python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tyjk8997/백준-BFS-토마토2python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)