https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
import sys
from collections import deque
m, n = map(int,sys.stdin.readline().split())
# 토마토를 담을 상자이다.
box = []
# 정답을 구할때 사용할 수이다.
count = 0
# 익은 토마토를 담을 리스트이다.
hot_tomato = deque()
# for 문을 돌리면서 박스를 토마토로 채운다.
for i in range(n):
box.append(list(map(int, sys.stdin.readline().split())))
# 이중 for문을 돌리면서 박스에 담긴 토마토의 위치를 큐에 저장한다.
# 왜냐? 토마토의 위치가 중요하기 때문에
for i in range(len(box)):
for j in range(len(box[0])):
if box[i][j] == 1:
hot_tomato.append([i,j])
# 문제를 보면 익은 토마토는 위아래에만 영향을 준다고 한다.
# 따라서 이와 같은 방법을 이용하면 4가지의 방향에 대한 이동을 표현 할수 있다.
dx = [-1,1,0,0]
dy = [0,0,-1,1]
# bfs를 구현해보자
def bfs():
# 익은 토마토의 큐를 이제 하나씩 뽑으면서 확인해보자
while hot_tomato:
# 익은 토마토의 위치를 x,y로 뽑아낸다.
x, y = hot_tomato.popleft()
# 이제 for문을 돌리면서 위치를 돌려준다.
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
# nx, ny의 범위와 해당 box[nx][ny] 가 빈곳인지 토마토인지 확인한다.
if 0<=nx <n and 0<= ny <m and box[nx][ny] == 0:
# 토마토가 맞다면 그전에 있던 박스의 칸 값에 1을 더하고 현재 확인중인 칸에 넣는다.
box[nx][ny] = box[x][y] +1
# 그러고 나서 익은 토마토의 위치를 큐에 넣는다.
# 여기서 큐에 넣는 이유는 넣은 순서대로 뽑아서 확인하기 때문이다.
hot_tomato.append([nx,ny])
bfs()
print(box)
for i in range(len(box)):
for j in range(len(box[0])):
# 여기서 왜? 박스에 0이 있는지 확인하는 걸까?
# 문제에서 모든 토마토가 안익으면 -1을 print 하라 했기 때문에 0이 하나라도 있으면 답은 -1이다.
if box[i][j] ==0:
print(-1)
exit(0)
count = max(count, max(box[i]))
print(count-1)
이 문제에서는 exit를 쓰는법을 배웠다?
좋은 함수인거 같다.
기본적인 bfs를 활용하는 문제이다.
이문제 낫베드하다 대중적인 방식으로 해결한거 같다?
반응형
'알고리즘 공부 > BFS & DFS' 카테고리의 다른 글
[백준] 7569번 토마토 - 파이썬 (0) | 2022.02.22 |
---|---|
[백준] 7562번 나이트의 이동 - 파이썬 (0) | 2022.02.19 |
[백준] 2178번 미로 탐색 - 파이썬 (0) | 2021.08.18 |
[백준] 1012번 유기농 배추 - 파이썬 (0) | 2021.08.18 |
[백준] 2606번 단지번호붙이기 - 파이썬 (0) | 2021.08.17 |