보물창고 블로그

백준 알고리즘 7569번 토마토 풀이 With Python 본문

알고리즘 풀이/백준 알고리즘

백준 알고리즘 7569번 토마토 풀이 With Python

홋 메 2020. 7. 2. 15:15
728x90

문제 링크: https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

문제의 핵심은 먼저 안 익은 토마토의 개수를 카운트하는 것입니다. 그리고 안 익은 토마토를 익은 토마토로 바꿀 때마다 안 익은 토마토의 개수를 -1을 더해주고, 만약 0이 된다면 마지막 안 익은 토마토를 익은 토마토로 바꾸게 만든 토마토의 변환 날짜에 1을 더해주면 됩니다. 저는 큐에 토마토의 좌표와 익게 된 날짜를 집어넣어 문제를 해결하였습니다. 소스코드는 아래와 같습니다. 

 

import sys
from collections import deque

dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
queue = deque()
m, n = map(int, sys.stdin.readline().split())
answer = -1
day = 0
count = 0
board = []
for i in range(n):
    list1 = list(map(int, sys.stdin.readline().split()))
    for j in range(m):
        if list1[j] == 1:
            queue.append((i, j, 0))
        elif list1[j] == 0:
            count += 1
    board.append(list1)
if count == 0:
    print(0)
elif count > 0 and not deque:
    print(-1)
else:
    while queue:
        x, y, daycount = queue.popleft()
        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]
            if -1 < nx < n and -1 < ny < m and board[nx][ny] == 0:
                board[nx][ny] = 1
                count -= 1
                if count == 0:
                    day = daycount + 1
                    break
                queue.append((nx, ny, daycount + 1))
    if count == 0:
        print(day)
    else:
        print(-1)

소스코드에 대한 질문이 있으시면 댓글남겨주시면 답변드리겠습니다.

Comments