코딩 공부

[Python] 백준 2573번 : 빙산 본문

BFS & DFS

[Python] 백준 2573번 : 빙산

Algomalgo 2024. 6. 26. 18:21
728x90


<접근 방법>
[1] 빙산이 2개의 덩이로 분리되거나 다 녹을 때까지 분리되지 않는다면 끝인 종료 조건을 생각한다.
[2] 빙산이 있는 칸들은  BFS를 통해 각각 녹는 높이를 계산(사방 0인 칸의 개수)한다.


from collections import deque

def bfs(si, sj):
    q = deque()
    q.append((si, sj))
    visited[si][sj] = 1
    candidates = []
    while q:
        ci, cj = q.popleft()
        cnt = 0
        for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
            ni = ci + di
            nj = cj + dj
            if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
                if arr[ni][nj] == 0:
                    cnt += 1
                else:
                    q.append((ni, nj))
                    visited[ni][nj] = 1
        if cnt: candidates.append((ci, cj, cnt))	// 녹을 수 있는 칸과 녹는 높이 저장
    for x, y, k in candidates:
        arr[x][y] = max(0, arr[x][y]-k)	// 0보다 더 녹지 않음
    return


N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]
year = 0
while True:
    visited = [[0]*M for _ in range(N)]
    dump = 0
    for i in range(N):
        for j in range(M):
            if arr[i][j] != 0 and not visited[i][j]:	// 빙산이 존재하고 미방문이면
                dump += 1	# 덩어리 + 1
                if dump > 1:	# 덩어리가 2개 이상이면 Break
                    break
                bfs(i, j)	# 그렇지 않으면 bfs를 통해 녹여주기
            if dump > 1:	# 덩어리가 2개 이상이면 Break
                break

    if dump > 1 or dump == 0: break		// 종료 조건
    year += 1
    
if dump == 0:	# 덩어리가 끝까지 나뉘지 않는다면 0 출력
    year = 0

print(year)

이해되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90