동까의 코딩

[Python] 백준 7576 : 토마토 본문

문제 풀이/백준

[Python] 백준 7576 : 토마토

동까의 코딩 2024. 2. 27. 22:31
반응형

BFS로 푸는 기본적인 문제 중에 하나인 토마토 문제를 풀어보았습니다.

 

 

 

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

 

7576번: 토마토

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

www.acmicpc.net

 

저의 풀이는 5가지로 나눴습니다.

1. 맵과 n,m을 입력받는다.

2. 토마토가 있는 1의 지점을 받고 queue에 저장한다.

3. bfs에 넣어서 queue에서 pop 해주어 동서남북으로 탐색 후 0을 발견하면 지금 자리에 +1을 하여 맵에 업데이트 후 queue에 해당 좌표를 넣어준다.

4. queue가 비게 될 경우까지 반복을 한다.

5. 맵에서 0이 있으면 -1을 출력하고, 맵에서 가장 큰 숫자를 뽑아주고 -1을 하여 출력하여준다.

 

 

from collections import deque
dx = (-1, 0, 1, 0)
dy = (0, 1, 0, -1)
m, n = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
res = 0
queue = deque()

for i in range(n):
    for j in range(m):
        if matrix[i][j] == 1:
            queue.append([i,j])


def bfs():
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx, ny = dx[i] + x, dy[i] + y
            if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 0:
                matrix[nx][ny] = matrix[x][y] + 1
                queue.append([nx, ny])

bfs()

for i in matrix:
    for j in i:
        if j == 0:
            print(-1)
            exit(0)
    res = max(res, max(i))
print(res - 1)

 

이상입니다!

반응형

'문제 풀이 > 백준' 카테고리의 다른 글

[Python] 백준 2920 : 음계  (0) 2024.03.09
[Python] 백준 2083 : 럭비 클럽  (0) 2024.03.05
[Python] 백준 1264 : 모음의 개수  (0) 2024.03.05
[Python] 백준 2798 : 블랙잭  (2) 2024.03.04
[Python] 백준 9012번: 괄호  (2) 2024.02.27