728x90
반응형
https://www.acmicpc.net/problem/2638
2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로
www.acmicpc.net
문제 해결
- 전형적으로 그래프 안에서 이동해서 모두 공기가 되는데 까지 걸리는 시간이므로 bfs를 사용하는 것이 좋을 것이다.
- 그런데 문제는 치즈를 중심으로 보는 것이 아니라 공기를 중심으로 언제 녹는 벽(치즈)가 다 없어지는지 확인하는 문제이다.
- 따라서 While 반복문을 통해 시간을 측정하면서 언제 장애물을 안만나는지 확인하면 되는문제
- BFS로 공기를 이동시키면서 어느 치즈지역이 공기를 2번 이상 만나면 치즈를 공기로 바꿔가며 그래프를 모두 공기로 만들면 되는 문제이다.
CODE
import sys
input = sys.stdin.readline
from collections import deque
def bfs_air(i,j):
dxs = [0,0,-1,1]
dys = [-1,1,0,0]
que = deque()
que.append((i,j))
air[i][j] = 1
while que:
x, y = que.popleft()
for dx, dy in zip(dxs,dys):
nx = x + dx; ny = y + dy
if 0<=nx<N and 0<=ny<M:
if board[nx][ny] ==0 and air[nx][ny] == 0:
air[nx][ny] = 1
que.append((nx,ny))
elif board[nx][ny] ==1 :
air[nx][ny] += 1
if air[nx][ny] >=2:
board[nx][ny] = 0
if __name__=='__main__':
N, M = map(int, input().split()) # 세로, 가로
board= [list(map(int, input().split())) for _ in range(N)]
time = 0
while True:
air = [[0 for _ in range(M)] for _ in range(N)]
bfs_air(0,0)
time += 1
cnt = 0
for i in range(N):
for j in range(M):
if board[i][j] ==0:
cnt += 1
if cnt== N*M:break
print(time)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1138 한 줄로 서기 (1) | 2024.01.11 |
---|---|
[python] 백준 20310 타노스 (1) | 2023.12.23 |
[python] 백준 13904 과제 (0) | 2023.12.14 |
[python] 백준 10835 카드게임 (0) | 2023.12.13 |
[python] 백준 13335 트럭 (0) | 2023.12.10 |
댓글