본문 바로가기
Algorithm_PYTHON

[백준_파이썬]7576번_토마토

by 코리니덕 2021. 8. 24.

# 토마토들이 바이러스처럼 익힌 애들로 인해 다른 애들도 익음
# 바이러스처럼 퍼져나가고, 최소 일수(거리)니까 bfs사용

 

- exit(0) : 성공적으로 프로그램을 종료

- exit(1) : 성공적으로 프로그램을 종료하지 못함

from collections import deque
q = deque()

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

# 토마토 상자의 크기
m, n = map(int, input().split())
tomato = [list(map(int, input().split())) for _ in range(n)]

for i in range(n):
    for j in range(m):
        # 익은 토마토가 여러 곳에 있을 수 있으니 익은 토마토의 위치를 큐에 먼저 집어넣기
        if tomato[i][j] == 1:
            q.append((i, j)) 

while q:
    x, y = q.popleft()    

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        # 범위 안에 있으면서, 안익은 토마토가 있다면 
        if 0 <= nx < n and 0 <= ny < m:
            if tomato[nx][ny] == 0:
                tomato[nx][ny] = tomato[x][y] +1
                q.append((nx, ny))

# 토마토가 다 익었다면, 그때의 최소날짜 출력위한 변수
result = -2

# 안 익은게 있는지 체크할 변수(0 : 모두 익은 상태, -1 : 모두 익지 못한 상태)
flag = 0
for i in range(n):
    for j in range(m):
        # 안 익은 토마토가 있다면 flag에 1대입
        if tomato[i][j] == 0:
            flag = -1 
        result = max(result, tomato[i][j])

# 토마토가 안 익었을 때,
if flag == -1:
    print(-1)
# 토마토가 모두 익었을 때,
# 1. 애초에 모두 익혀져 있어, 익힐 필요가 없는 경우(result=1인경우가 최대) - 0출력
# 2. 최소 일 수 출력
elif flag == 0:
    if result == 1:
        print(0)
    else:
        print(result-1) # 1부터 시작했으니 -1해주기

 

from collections import deque
q = deque()

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

# 토마토 상자의 크기
m, n = map(int, input().split())
tomato = [list(map(int, input().split())) for _ in range(n)]

for i in range(n):
    for j in range(m):
        # 익은 토마토가 여러 곳에 있을 수 있으니 익은 토마토의 위치를 큐에 먼저 집어넣기
        if tomato[i][j] == 1:
            q.append((i, j)) 

while q:
    x, y = q.popleft()    

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        # 범위 안에 있으면서, 안익은 토마토가 있다면 
        if 0 <= nx < n and 0 <= ny < m:
            if tomato[nx][ny] == 0:
                tomato[nx][ny] = tomato[x][y] +1
                q.append((nx, ny))

# 토마토가 다 익었다면, 그때의 최소날짜 출력위한 변수
result = 0
for i in range(n):
    for j in range(m):
        # 안 익은 토마토가 있다면 flag에 1대입
        if tomato[i][j] == 0:
            print(-1)
            exit(0) # 만약, 익지 않은 토마토가 있을 때, 바로 프로그램 종료
        result = max(result, tomato[i][j])
print(result -1)