Algorithm/BOJ

[백준] 7576 토마토 (파이썬 python)

YOONJELLY 2024. 3. 2. 22:08

 

문제 링크

 

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

 

문제 풀이

 

전형적인 BFS 문제로 문제 조건을 잘 따라가다보면 해결할 수 있는 문제입니다.

 

from collections import deque

m, n = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
visited = [[0] * m for _ in range(n)]
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:
            queue.append([i, j])
            visited[i][j] = 1

 

전체 배열을 입력받고 익은 토마토(1)일 경우 큐에 추가해주고 방문 처리를 해줍니다.

 

이 문제에서는 최종적으로 나올 수 있는 결괏값이 총 3가지입니다.

(1) 토마토가 모두 익을 때까지의 최소 날짜

(2) 처음부터 토마토가 모두 익어있었다면 1

(3) 토마토가 모두 익을 수 없다면 0

 

이를 분리하기 위해 flag라는 변수를 생성하고 상태를 저장하고자 했습니다.

flag = 1
# 처음부터 모든 토마토가 익어있었을 경우
if len(queue) == m * n:
    flag = 0
    
# 처음에 모든 토마토가 익은 상태가 아니었을 경우에 대해서만 실행
if flag:
    while queue:
        x, y = queue.popleft()
        for dir in range(4):
            nx = x + dx[dir]
            ny = y + dy[dir]
            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
                visited[nx][ny] = 1
                if graph[nx][ny] == 0:
                    queue.append([nx, ny])
                    graph[nx][ny] = graph[x][y] + 1
    for i in range(n):
        max_val = max(max_val, max(graph[i]))
        # bfs가 끝났음에도 익지 않은 토마토(0)가 남아있을 경우
        if 0 in graph[i]:
            flag = -1
            break

# 정상적으로 최소 날짜를 출력할 경우
if flag > 0:
    print(max_val - 1)
# 그 외의 경우 (모든 토마토가 익지 않았을 경우, 처음부터 모든 토마토가 익었을 경우)
else:
    print(flag)

 

 

전체 코드

 

from collections import deque

m, n = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
visited = [[0] * m for _ in range(n)]
queue = deque()
flag = 1
max_val = 0
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:
            queue.append([i, j])
            visited[i][j] = 1
if len(queue) == m * n:
    flag = 0
if flag:
    while queue:
        x, y = queue.popleft()
        for dir in range(4):
            nx = x + dx[dir]
            ny = y + dy[dir]
            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
                visited[nx][ny] = 1
                if graph[nx][ny] == 0:
                    queue.append([nx, ny])
                    graph[nx][ny] = graph[x][y] + 1
    for i in range(n):
        max_val = max(max_val, max(graph[i]))
        if 0 in graph[i]:
            flag = -1
            break
if flag > 0:
    print(max_val - 1)
else:
    print(flag)