[Python] 백준 2636: 치즈
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])
'알고리즘 > 백준' 카테고리의 다른 글
| [Python] 백준 10026 : 적록색약 (0) | 2023.05.05 |
|---|---|
| [Python] 백준 2644: 촌수 계산 (0) | 2023.05.01 |
| [Python] 백준 1788: 피보나치 수의 확장 (0) | 2023.04.17 |
| [Python] 백준 1463: 1로 만들기 (0) | 2023.04.13 |
| [Python] 백준 1932: 정수 삼각형 (0) | 2023.04.13 |
TAGS.
