7576. 토마토

jp·2021년 9월 26일
0

baekjoon

목록 보기
3/15

문제

코드

from collections import deque
import sys
input = sys.stdin.readline

M, N = map(int, input().split())
tmt = [list(map(int, input().split())) for _ in range(N)]
dir = [(-1,0), (1,0), (0,-1), (0,1)]
q = deque()
for i in range(N):
    for j in range(M):
        if tmt[i][j] == 1:
            q.append((i, j))
while q:
    i, j = q.popleft()
    for k in range(4):
        ni, nj = i+dir[k][0], j+dir[k][1]
        if 0<=ni<N and 0<=nj<M and tmt[ni][nj] == 0:
            tmt[ni][nj] = tmt[i][j] + 1
            q.append((ni,nj))
is_ripe = True
mx = 0
for i in tmt:
    if 0 in i:
        is_ripe = False
        break
    if mx < max(i):
        mx = max(i)
if is_ripe:
    print(mx-1)
else:
    print(-1)

풀이

코드가 이렇게 길어도 되는건가...

줄이고싶은데 실력이 안된다... 아직 최단거리 문제가 이해가 완벽히 되지 않은듯. 아무튼 전에 풀었던 것과 같이 최단거리(시간초)로 해서 토마토 들어있는 칸을 지날때마다 작성해준다.


그리고 bfs를 다 돌았는데도 0이 있으면 토마토가 다 익지 않았다는 뜻이므로 -1 을 출력해주기 위해서 bfs밑에 for문을 돌았음. 익지 않은것을 is_ripe로 True/False 나타냈고, 초 수를 구하기 위해서 mx값을 구했다. 처음에는 max(max(tmt))로 했었는데 이게 안되는 이유는 max(tmt)이기 때문에.. 한줄의 값의 합이 제일 큰걸로 계산되어서 그럼


그래서 어차피 for하나 도는거 밑에 mx값도 같이 구해주었다
마지막 if는 다 익었는지 여부를 확인해 초수를 출력할 지 못구했다는 것(-1)을 출력할지 정하는 분기이다

profile
응애 개발자지망생이 알고리즘에 고통받는 중

0개의 댓글