백준 7576번 : 토마토

노영진·2023년 9월 28일

전체 코드

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


def decision(res):
    if res == "BFS":
        BFS(table, data)
        res = 0
        for i in range(n):
            for j in range(m):
                if table[i][j] == 0:
                    return -1
                res = max(table[i][j], res)
        return res-1
    else: 
        return 0


def BFS(table, data):
    res = 0
    q = deque([])
    for t in data:
        q.append(t)
    while q:
        x, y = q.popleft()
        dx = [-1,1,0,0]
        dy = [0,0,-1,1]
        # 상하좌우
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if (0 <= nx < n) and (0 <= ny < m):
                if table[nx][ny] == 0:
                    table[nx][ny] = table[x][y] + 1
                    res = max(table[nx][ny], res)
                    q.append((nx, ny))
    return table


m, n = map(int, input().split())
table = [list(map(int, input().split())) for _ in range(n)]
data = []
res = False
for i in range(n):
    for j in range(m):
        if table[i][j] == 1:
            data.append((i, j))
        else:
            res = "BFS"

print(decision(res))

접근

이건 그냥 누가 봐도 BFS문제이다.
1. input을 받아서 n * m 테이블 만들기
2. 초기 table값 중에 익지 않은 토마토, 즉 0이 하나도 없다면 그냥 0을 출력하고 종료
3. 초기 table값 중 익은 토마토의 위치 정보를 data 리스트에 저장
4. BFS함수 - table과 data를 받아서 data를 양방향 큐로 바꿔주고 BFS 실행 (방문할 때마다 table값을 1씩 증가시킴)
5. decision함수 - table을 돌면서 0이 남아있으면 -1을 리턴하고 없으면 최댓값-1을 리턴

정답!

0개의 댓글