bong-u/til

백준 - 2638 : 치즈 (G3)

수정일 : 2024-11-15

 1from collections import deque
 2
 3dx = [0, 0, -1, 1]
 4dy = [-1, 1, 0, 0]
 5
 6N, M = map(int, input().split())
 7L = [list(map(int, input().split())) for _ in range(N)]
 8
 9def check():
10    q = deque()
11    q.append((0, 0))
12
13    visited = [[0]*M for _ in range(N)]
14    visited[0][0] = 1
15
16    while q:
17        curX, curY = q.popleft()
18
19        for i in range(4):
20            nX = curX + dx[i]
21            nY = curY + dy[i]
22
23            if 0 <= nX < N and 0 <= nY < M:
24                if L[nX][nY] == 0 and visited[nX][nY] == 0:
25                    q.append((nX, nY))
26                    visited[nX][nY] = 1
27                elif L[nX][nY] == 1:
28                    visited[nX][nY] += 1
29    melted = []
30    for i in range(N):
31        for j in range(M):
32            if visited[i][j] >= 2:
33                melted.append((i, j))
34
35    return melted
36
37result = 0
38
39while True:
40    isAnyCheese = False
41
42    melted = check()
43
44    if not melted:
45        break
46
47    for x, y in melted:
48        L[x][y] = 0
49
50    result += 1
51
52print (result)

문제

  • N X M 크기의 판 위에 치즈가 표시되어 있다
  • 2변 이상의 실외의 공기와 접촉하면 해당 치즈는 녹는다
  • 치즈가 모두 녹을 때까지 걸리는 시간을 구하라

해결방법

  • 외부공기를 따라 BFS를 수행한다
  • 두 번이상 visit된 치즈는 melted 리스트에 넣었다가 한번에 녹인다
  • 녹은 치즈가 없다면 모든 치즈가 녹은 것으로 간주한다

고찰

  • 여러 시도 이후 메모리 초과를 해결하지 못해 답을 찾아보았다.