https://www.acmicpc.net/problem/7576
Solution
BFS로 구현할 수 있다.
queue로 구햔하면 시간초과가 뜨기에 deque로 구현해준다. BFS로 해야, 1에서 최근접값을 찾을 수 있다.
1) 먼저 이미 익은 토마토를 queue에 넣고
2) queue안의 토마토를 앞에서부터 뽑아내준다.
3) 뽑아낸 토마토의 상하좌우에 안익은 토마토가 있으면 현재까지의 토마토 날에 +1을 해준다.
4) while문이 모두 돈 뒤, 0이 있으면 -1을 출력해주고, 없다면 배열 내의 최댓값 -1 을 출력해준다.
Python Code
import copy
from collections import deque
M, N = map(int, input().split())
box = []
for _ in range(N):
box.append(list(map(int, input().split())))
ripen_box = copy.deepcopy(box) #같은 리스트를 하나 더 생성(안해도 상관 없음)
queue = deque() #일반 리스트로 큐를 구현하면 시간이 너무 오래걸린다
for i in range(N):
for j in range(M):
if box[i][j] == 1:
queue.append([i, j]) #이미 익어있는 토마토 위치를 큐에 넣어줌
while queue:
[i, j] = queue.popleft() #하나씩 빼면서 비교
#위
if i > 0 and ripen_box[i-1][j] == 0:
queue.append([i-1, j]) #큐에 넣고
ripen_box[i-1][j] = ripen_box[i][j] + 1 #하루 더 기다려야하니, 1을 더해준다.
#아래
if i < N-1 and ripen_box[i+1][j] == 0:
queue.append([i+1, j])
ripen_box[i+1][j] = ripen_box[i][j] + 1
#왼쪽
if j > 0 and ripen_box[i][j-1] == 0:
queue.append([i, j-1])
ripen_box[i][j-1] = ripen_box[i][j] + 1
#오른쪽
if j < M-1 and ripen_box[i][j+1] == 0:
queue.append([i, j+1])
ripen_box[i][j+1] = ripen_box[i][j] + 1
answer = True
for row in ripen_box: #0이 하나라도 있을 경우 -1출력
if 0 in row:
print(-1)
answer = False
break
if answer:
min_day = 0
for row in ripen_box:
min_day = max(min_day, max(row)) #익기 위한 최소 날 = ripen_box의 최댓값
print(min_day-1)
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#223 백준 파이썬 [1697] 숨바꼭질 - BFS (0) | 2019.11.28 |
---|---|
#222 백준 파이썬 [7569] 토마토 - 3차원 BFS (0) | 2019.11.28 |
#220 백준 파이썬 [11049] 행렬 곱셈 순서 (1) | 2019.11.27 |
#219 백준 파이썬 [1780] 종이의 개수 - 분할정복 (0) | 2019.11.22 |
#218 백준 파이썬 [1992] 쿼드트리 - 분할정복 (0) | 2019.11.22 |