백준 2636번 - 치즈
2636번: 치즈
아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓
www.acmicpc.net
🙄 문제 이해
치즈가 공기 중에 노출되면 한 시간 뒤 녹게 됩니다.
사각형의 판 안에서 치즈가 전부 사라지는 과정에서 전부 녹는데 걸리는 시간과 마지막에 남는 치즈의 갯수를 구하는 문제입니다.
📝 문제 풀이
BFS로 해결했고, 마지막 결과를 구하는 로직에서 어려움을 겪었습니다.
문제를 풀면서 했던 생각은 아래와 같습니다.
가장자리 부분을 -1로 바꿔야함(벽 만들기)
빈칸을 탐색하는데
다음 탐색 칸이
- 빈칸(0)이면 -> 방문처리하고 큐에 넣음
- 치즈(1)이면 -> 방문처리하고 빈칸으로 바꿈. *큐에 넣지는 x
- 벽(-1)은 처리 x
치즈가 모두 녹는데 걸리는 시간 + 모두 녹기 한 시간 전에 남아있는 치즈조각이 놓여 있는 칸의 개수?
-> 이걸 어떻게 구할 것인가?
BFS함수 종료하기 전에 지울 치즈의 갯수를 체크(리턴)
while문으로 BFS함수 반복 실행.
실행시마다 전체 치즈 - 지울 치즈 갯수
if 치즈 다 지워지면 종료
시간 +1
💻 Python 코드
#백준 2636 치즈
from collections import deque
import sys
input = sys.stdin.readline
def bfs():
visited = [[False]*m for _ in range(n)]
visited[0][0] = True
q = deque()
q.append((0,0))
rm = []
while q:
x,y = q.popleft()
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
visited[nx][ny] = True
if graph[nx][ny] == 0:
q.append((nx, ny))
elif graph[nx][ny] == 1:
rm.append((nx,ny))
for x,y in rm:
graph[x][y] = 0
return len(rm)
n, m = map(int, input().split())
graph = []
count = 0
for i in range(n):
arr = list(map(int, input().split()))
graph.append(arr)
count += sum(graph[i])
time = 1
while True:
melt = bfs()
count -= melt
if count == 0:
break
time += 1
print(time)
print(melt)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] N-Queen (백준 9663번 파이썬) (2) | 2024.09.18 |
---|---|
[Python] N과M (1) (백준 15649번 파이썬) (0) | 2024.09.17 |
[Python] 수 묶기 (백준 1744번 파이썬) (0) | 2024.01.06 |
[Python] 암호만들기 (백준 1759번 파이썬) (1) | 2023.11.23 |
[Python] 숨바꼭질4 (백준 13913번 파이썬) (1) | 2023.11.21 |