-
[백준] 7569번 문제 (토마토) 파이썬(Python) 풀이Problem Solving/Baekjoon 2021. 9. 10. 10:15
https://www.acmicpc.net/problem/7569
import sys from collections import deque input = sys.stdin.readline q = deque() def bfs(): global result while q: qh, qn, qm = q.popleft() for d in range(6): nh = qh + dh[d] nn = qn + dn[d] nm = qm + dm[d] if 0 <= nh < h and 0 <= nn < n and 0 <= nm < m and tmts[nh][nn][nm] == 0: tmts[nh][nn][nm] = tmts[qh][qn][qm] + 1 result = max(tmts[qh][qn][qm] + 1, result) q.append([nh, nn, nm]) # 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 dh = [-1, 1, 0, 0, 0, 0] dn = [0, 0, 0, 0, -1, 1] dm = [0, 0, -1, 1, 0, 0] m, n, h = map(int, input().split()) tmts = [] result = -1 for _ in range(h): temp = [] for _ in range(n): temp.append(list(map(int, input().split()))) tmts.append(temp) is_already_done = True for i in range(h): for j in range(n): for k in range(m): if tmts[i][j][k] == 1: q.append([i, j, k]) if tmts[i][j][k] == 0: is_already_done = False bfs() # bfs 종료 후 토마토가 다 익지 않은 경우 for i in range(h): for j in range(n): for k in range(m): if tmts[i][j][k] == 0: print(-1) sys.exit(0) # 입력받은 토마토가 이미 다 익은 경우 if is_already_done: print(0) # 그 외의 경우 else: print(result - 1)
코드가 좀 긴데.. 파이썬이라 그나마 이정도다.
3차원 배열 형태로 문제를 풀어야 해서 살짝 머리가 아팠는데.. 천천히 생각하니 할만했다.
입력받은 토마토들을 전체를 순회하면서 익은 토마토(1인 경우)의 경우에 queue에 append 해준다.
그리고 bfs를 통해 탐색하며 위, 아래, 왼쪽, 오른쪽, 앞, 뒤에 익지 않은 토마토(0의 경우)를 익은 토마토 보다 1이 더 큰 숫자로 저장한다.
- bfs 종료 후 토마토를 한번 전체 탐색하여 0이 있으면 토마토가 다 익지는 않은 경우이므로 -1을 출력한다.
- 입력받은 토마토가 이미 다 익은 토마토의 경우에는 0을 출력한다.
- 그 외의 경우는 result - 1 를 출력하여 최소 일수를 출력한다.
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 11279번 문제 (최대 힙) 파이썬(Python) 풀이 (0) 2021.09.14 [백준] 1927번 문제 (최소 힙) 파이썬(Python) 풀이 (0) 2021.09.14 [백준] 12852번 문제 (1로 만들기 2) 파이썬(Python) 풀이 (0) 2021.09.09 [백준] 1021번 문제 (회전하는 큐) 파이썬(Python) 풀이 (0) 2021.09.09 [백준] 16948번 문제 (데스나이트) 파이썬(Python) 풀이 (0) 2021.09.07