본문 바로가기

알고리즘/백준

[백준] 2636번 : 치즈

728x90

2636번: 치즈

해당문제는 치즈가 없어지는 시간을 구하는 문제로 너비우선탐색으로 문제를 해결 할 수 있습니다.

치즈가 녹아서 없어지는 과정은 그래프를 순회하면서 빈공간인 경우 상하 좌우로 치즈를 녹여서 없앱니다.

여기서 상하좌우로 녹인 치즈는 방문처리를하여 다른 빈공간에서 치즈를 또 녹이지 않도록 합니다.

치즈를 녹이기 전 마지막 치즈의 개수는 마지막에 녹인 치즈를 카운팅 하여 모두 녹기전에 있던 치즈의 개수를 알 수 있습니다.

move = [(0,1), (1,0), (0,-1), (-1,0)]
from collections import deque
H,W = map(int, input().split())
table = []

for _ in range(H):
    table.append(list(map(int, input().split())))
def meltcheeze():
    visited = [[False for _ in range(W)] for _ in range(H)] # bfs 방문처리
    cnt = 0 # 녹을 치즈 개수를 샌다.
    queue = deque()
    queue.append((0,0))
    visited[0][0] = True
    while queue:
        i,j = queue.popleft()
        for dy,dx in move:
            ny = dy + i
            nx = dx + j
            if H > ny >= 0 and W > nx >= 0 and not visited[ny][nx]:
                visited[ny][nx] = True
                if table[ny][nx] == 0: # 치즈가 아닐때문 이어서 방문
                    queue.append((ny,nx))

    for i in range(H):
        for j in range(W):
            if table[i][j] and visited[i][j]: # 치즈를 녹인다.
                cnt += 1
                table[i][j] = 0

    return cnt

time = 0
ans = 0
prev = 0
while True:
    ans = meltcheeze()
    if ans == 0:
        break

    time+=1
    prev = ans

print(time)
print(prev)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2565번 : 전기줄  (0) 2023.10.17
[백준] 17471번 : 게리맨더링  (0) 2023.10.17
[백준] 1062번 : 가르침  (0) 2023.10.15
[백준] 3055번 : 탈출  (0) 2023.08.31
[백준] 1005번 : ACM Craft  (0) 2023.08.31