Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](BFS) 백준 2636번 : 치즈 본문
728x90

<접근 방법>
- 항상 테두리 부분은 공기이므로 항상 (0, 0)을 시작으로 BFS를 돌린다.
- 시간이 얼마나 걸리는가를 구하기 위해 count라는 변수로 세주고 무한 while문을 돌려준다.
- BFS를 돌리면서 치즈를 만나면 치즈라는 리스트에 x, y좌표를 넣어주고 q에는 넣어주지 않는다.
공기를 만나면 q 안에 (x, y)를 넣어줌으로써 계속 q를 돌린다. - 이때 cheese에 저장되는 정보가 없으면 무한 반복문을 빠져나가도록 하고 그렇지 않으면 cheese개수 정보를 갱신해주고 가장 테두리 치즈 정보를 담고 있는 치즈 리스트에서 좌표를 꺼내며 공기(arr[x][y]==0)으로 바꿔준다.
from collections import deque
def bfs():
global answer # 가장 마지막에 남는 치즈 갱신 위함
q = deque()
q.append((0, 0)) # 항상 (0,0) 좌표는 공기이므로 (0,0)에서 시작
cheese = []
while q:
ci, cj = q.popleft()
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<M and not visited[ni][nj]: # 좌표내, 미방문이라면
if arr[ni][nj] == 0: # 공기라면
q.append((ni, nj)) # 계속해서 q에 넣음
visited[ni][nj] = 1
elif arr[ni][nj] == 1: # 치즈라면, q에 넣지 않고
visited[ni][nj] = 1
cheese.append((ni, nj)) # 치즈라는 리스트에 정보 담기
if not cheese: # 치즈가 하나도 없다면 --> 이미 다 녹은 상태
return 1 # 녹은 상태라는 의미로 1을 반환
answer = len(cheese) # 치즈가 있다면 최후의 치즈 개수 갱신
for i, j in cheese:
arr[i][j] = 0 # 공기에 접촉한 치즈들을 공기로 바꿔줌
return 0
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
count = 0
answer = 0
while True:
visited = [[0] * M for _ in range(N)]
if bfs():
break
count += 1
print(count)
print(answer)

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'BFS & DFS' 카테고리의 다른 글
[Python] 백준 11559번 : Puyo Puyo (0) | 2024.06.20 |
---|---|
[Python] 백준 16928번 : 뱀과 사다리 게임 (0) | 2024.06.18 |
[Python](BFS) 백준 18405번 : 경쟁적 전염 (0) | 2024.01.30 |
[Python](DFS/백트래킹) 백준 1759번 : 암호 만들기 (2) | 2024.01.29 |
[Python](BFS) 백준 10026번 : 적록색약 (0) | 2024.01.28 |