아이디어
- 전에 풀었던 7576 토마토 문제의 연장이다.
- 토마토를 받을 배열과 visited를 3차원으로 변경하고 BFS를 돌려보자
풀이
import sys; from collections import deque
def bfs(H, N, M):
for h in range(H):
for i in range(N):
for j in range(M):
if tomato[h][i][j] == 1:
Q.append((h, i, j))
visited[h][i][j] = 1
while Q:
h, i, j = Q.popleft()
'''
3차원 리스트에서의 움직임의 델타를 추가하면 된다.
2차원의 델타가 [1, 0].. 이었다면,
3차원은 [1, 0, 0], [0, 0, 1]... 등으로 주면 된다.
'''
for dh, di, dj in [[1, 0, 0], [0, 0, 1], [-1, 0, 0], [0, 0, -1], [0, 1, 0], [0, -1, 0]]:
nh, nr, nc = h + dh, i + di, j + dj
if 0 <= nh < H and 0 <= nr < N and 0 <= nc < M:
if tomato[nh][nr][nc] == 0 and visited[nh][nr][nc] == 0:
Q.append((nh, nr, nc))
visited[nh][nr][nc] = visited[h][i][j] + 1
def result():
for h in range(H):
for i in range(N):
for j in range(M):
if tomato[h][i][j] == 0:
if visited[h][i][j] == 0:
return print(-1)
ret = 0
for h in range(H):
for i in range(N):
if max(visited[h][i]) > ret:
ret = max(visited[h][i])
return print(ret-1)
M, N, H = map(int, sys.stdin.readline().split())
tomato = [[list(map(int, sys.stdin.readline().split())) for _ in range(N)] for h in range(H)]
Q = deque()
visited = [[[0] * M for _ in range(N)]for h in range(H)]
bfs(H, N, M)
result()
해설 및 후기
- 문제 풀이의 핵심은 3차원의 델타를 어떻게 주느냐 였다.
- 이 부분에서 많이 헤매었는데, 기존 델타의 방향을 하나 더 추가해야 했다.
- 기존 델타가 [0, 1] 이런 식이라면 3차원은 [0, 0, 1] 이런 식으로 하나 더 추가하면 되었다.
- 일단 풀긴 풀었지만, 토마토가 익지 않은 경우를 찾는데 더 효율적인 방법으로 풀고 싶었다...
- 다음부턴 더 효율적이고 최적화하여 풀어보기로 한다.
'백준' 카테고리의 다른 글
백준 2589 보물섬 BFS (파이썬) (0) | 2022.09.11 |
---|---|
백준 2468 안전 영역 DFS (파이썬) (0) | 2022.09.11 |
백준 7576 토마토 BFS (파이썬) (0) | 2022.09.10 |
백준 1012 유기농 배추 DFS (파이썬) (0) | 2022.09.05 |
백준 10026 적록색약 sys.setrecursionlimit (파이썬) (0) | 2022.09.03 |