[백준] 7576번 토마토

게으른 완벽주의자·2023년 2월 15일

백준

목록 보기
7/27

백준_7576

from collections import deque
m, n = map(int, input().split())
tomato = deque()
box = []

visited = [[0]*m for _ in range(n)]
for i in range(n):
    b = list(map(int, input().split()))
    box.append(b)
    for j in range(m):
        if b[j]==1:
            #tomato가 있는 위치 입려해두기 (x,y,day)
            tomato.append((i,j,0))
        elif b[j]==-1:
            #미리 방문처리
            #-1이 여러개 모여 둘러쌓여있는 경우에는 가운데에 있는 -1을 확인할 수 없음
            visited[i][j]=1

dx = [0,0,1,-1]
dy = [1,-1,0,0]

result = 0
while tomato:
    x, y, day = tomato.popleft()
    visited[x][y] = 1
    for k in range(4):
        nx = x+dx[k]
        ny = y+dy[k]
        if 0<=nx<n and 0<=ny<m and not visited[nx][ny]:
            if box[nx][ny]==0:
                box[nx][ny]=1
                visited[nx][ny]=1
                result = day+1  #result를 day+1가 아닌 +1을 하게 되면 토마토가 익는 만큼 증가하게 됨
                tomato.append((nx,ny,day+1))

flag = True
for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            flag = False
            break
    if not flag: break

#-1은 미리 방문처리 했으므로
#모두 방문처리 됐다면, 모든 토마토가 익을 수 있는 경우를 뜻함
if flag:
    print(result)
else:
    print(-1)

-1을 어떻게 처리해야하나 고민을 했어서 문제를 다 푼 후에 다른 분의 코드도 살펴보았다.
방문처리하는 visited없이, 익지 않은 토마토를 발견하면 이전 위치값+1을 해주면서 날짜를 하루씩 더해가는 방법이 인상깊었다.

profile
데이터를 공부하고 있습니다

0개의 댓글