알고리즘/백준
[Python] 백준 2636: 치즈
suwonieee
2023. 4. 18. 16:21
https://www.acmicpc.net/problem/2636
2636번: 치즈
첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진
www.acmicpc.net
접근 로직
단순한 bfs문제라고 생각하고 접근을 하려 했으나 문제의 TC에서 알 수 있듯 바깥 공기와 맞닿은 치즈와 안쪽 구멍과 맞닿은 치즈를 구별해주는 것이 중요하다.
초반에는 녹는 치즈를 2로 따로 구별을 하고 한번에 녹여주려고 했으나... 너무 무의미한 부분이고 굳이? 싶어서 바로 녹여주는 것을 선택했다.
최종
#접근 로직: bfs로 사방탐색을 하면서... bfs를 한 번 돌 때마다 공기와 접촉한 부분은 녹았다고 처리해주기
# 치즈를 1, 공기를 0으로 할 것.
from collections import deque
dir = [(0,1),(0,-1),(-1,0),(1,0)]
def bfs():
cnt = 0
visited = [[False for _ in range(M)] for _ in range(N)]
q = deque()
q.append((0,0))
visited[0][0] = True
while q:
r,c = q.popleft()
for k in range(4):
nr = r + dir[k][0]
nc = c + dir[k][1]
if 0<=nr<N and 0<=nc<M and not visited[nr][nc]: #외부 공기와 맞닿은 치즈의 경우
if cheese[nr][nc] == 1: #치즈인 경우
visited[nr][nc] = True
cheese[nr][nc] = 0 # 녹았다!
cnt += 1
else:
visited[nr][nc] = True
q.append((nr,nc))
ans.append(cnt)
return cnt
N,M = map(int,input().split())
cheese = [list(map(int,input().split())) for _ in range(N)]
time =0
ans =[]
while True:
time += 1
cnt = bfs()
if cnt == 0:
break
print(time-1)
print(ans[time-2])