문제
기록 포인트
- BFS/DFS가 탐색 과정에서 인접 영역으로 확장되는 특징을 이용해 영역 구분하기
- 문제에서 동일한 공기(0)이더라도, 외부 영역과 치즈에 가로막힌 영역을 구분해야했음
- 이를 위해 외부 영역 중 한 곳(좌측 상단 == (0,0))에서 시작해 인접 셀로 확장해가는 방식으로 외부 영역이 닿는 곳을 확인할 수 있었음
- 탐색 영역을 확장하는 과정에서 주변 체크하기
- 포인트를 정확히 잡기 어려운데, 이 문제에서 외부 공기 영역을 탐색해가며, 해당 외부 공기 셀이 인접한 치즈 셀에 영향을 주었는지를 함께 체크하는 로직이 생각하기 어려웠음
- 지금까지 풀었던 문제들은 A를 기준으로 탐색하면 A만 찾아 탐색 영역에 추가하고 말았는데, 이번 문제는 A를 탐색하는 과정에서 인접한 B까지 함께 처리하는 문제였음
- 타임라인 별로 상태 관리하기
- 타임라인 별로 상태 관리를 하기 위해서는 하나의 시점에 처리할 로직들을 함수화해놓는 편이 편리하고, 로직을 파악하기에도 수월한 것 같음
접근 방식
제출 답안
import sys
from collections import deque
N, M = tuple(map(int, sys.stdin.readline().split()))
matrix = []
for _ in range(N):
row = list(map(int, sys.stdin.readline().split()))
matrix.append(row)
dxs = [-1, 1, 0, 0]
dys = [0, 0, -1, 1]
def update_matrix():
s = (0,0)
parent = {s: None}
queue = deque([s])
while queue:
v1 = queue.popleft()
r1, c1 = v1
for dx, dy in zip(dxs, dys):
r2, c2 = r1+dx, c1+dy
if r2 < 0 or r2 >= N or c2 < 0 or c2 >= M:
continue
v2 = (r2, c2)
if v2 in parent:
continue
cell = matrix[r2][c2]
if cell == 0:
parent[v2] = v1
queue.append(v2)
else:
matrix[r2][c2] += 1
def count_cheese():
cheese_count = 0
for r in range(N):
for c in range(M):
cell = matrix[r][c]
if cell >= 3:
matrix[r][c] = 0
elif cell >= 1:
matrix[r][c] = 1
cheese_count += 1
return cheese_count
cheese_count = count_cheese()
time = 0
while cheese_count:
time += 1
update_matrix()
cheese_count = count_cheese()
print(time)