https://www.acmicpc.net/problem/7569
풀이 코드
# https://www.acmicpc.net/problem/7569 import sys, collections input = sys.stdin.readline # 가로(열), 세로(행), 높이 N, M, H = map(int, input().split(" ")) arr = [] subArr = [] for i in range(M * H): if i % M == 0 and subArr: arr.append(subArr[:]) subArr = [] subArr.append(list(map(int, input().split(" ")))) arr.append(subArr[:]) dh = [0, 0, 0, 0, 1, -1] dr = [1, -1, 0, 0, 0, 0] dc = [0, 0, 1, -1, 0, 0] def check_days(): while q: (h, r, c) = q.popleft() days = arr[h][r][c] for i in range(6): nh, nr, nc = h + dh[i], r + dr[i], c + dc[i] if nh < 0 or nh > H -1 or nr < 0 or nr > M -1 or nc < 0 or nc > N -1: continue # bfs 특성상 후자의 조건에 걸릴 가능성은 없을 거 같긴 함 if arr[nh][nr][nc] == 0 or arr[nh][nr][nc] > days + 1: arr[nh][nr][nc] = days + 1 q.append((nh, nr, nc)) q = collections.deque() for i in range(H): for j in range(M): for k in range(N): if arr[i][j][k] == 1: # 멀티 소스 bfs # 이 부분!!! 풀이 보고 해결, 처음부터 익은 토마토들을 큐에 넣고 bfs 돌려야 했음 q.append((i, j, k)) check_days() result = 0 flag = False for i in range(H): for j in range(M): for k in range(N): if arr[i][j][k] == 0: flag = True break result = max(result, arr[i][j][k]) print(result - 1 if not flag else -1)
3차원 배열 bfs 는 처음 풀어보는 거 같다.
멀티 소스 bfs 도 처음이다.
- 그러다보니 멀티 소스 bfs 풀이를 바로 생각해내지 못했다. 처음에는 시간초과가 났다. 그래서 풀이를 살짝 찾아보고 수정한 건 안 비밀..!
- 변명?이지만 그 부분을 빼곤 기본 탐색 로직은 금방 작성했다...!
'Algorithm' 카테고리의 다른 글
[백준/트리/파이썬]나무 탈출 (0) | 2025.05.25 |
---|---|
[백준/구현/파이썬]폰 호석만 (0) | 2025.05.23 |
[MST/Union-Find]최소 신장 트리와 크루스칼 알고리즘 (0) | 2023.11.26 |
[Programmers/python]2023 현대모비스 예선 - 상담원 인원 (0) | 2023.09.29 |
Set 과 복사/깊은복사 생각해보기 (0) | 2023.09.02 |