1 minute read

Python 코드로 최소힙 추가/삭제 구현하기

def enq(data):
    global hsize
    hsize += 1
    H[hsize] = data

    c = hsize
    p = hsize // 2

    while p and H[p] > H[c]:
        H[p], H[c] = H[c], H[p]
        c = p
        p = c // 2

def deq():
    global hsize
    tmp = H[1]
    H[1] = H[hsize]
    hsize -= 1
    p = 1
    c = p * 2  # 왼쪽자식번호를 먼저 계산해서 

    while c <= hsize: # 왼쪽 자식이 있는지 확인
        if c + 1 <= hsize and H[c] > H[c + 1]: # 오른쪽 자식도 있고 오른쪽이 더 작으면 선택
            c += 1
        if H[p] > H[c]:  # 부모와 자식 비교
            H[p], H[c] = H[c], H[p] # 자식이 더 작으면 교환
            p = c           # 자리 바꿔서 자식 자리로 간 값과 그 자리의 자식번호 계산
            c = p * 2
        else:
            break

    return tmp

SWEA_5177_이진힙

def enq(data):
    global hsize
    hsize += 1
    H[hsize] = data
 
    c = hsize  # 자식노드
    p = hsize // 2  # 부모노드
 
    # 부모 노드가 존재하고, 최소힙의 조건을 만족하지 못하는 경우에 위치 교환
    while p and H[p] > H[c]:
        H[p], H[c] = H[c], H[p]
        c = p
        p = c // 2
 
T = int(input())
 
for tc in range(1,T+1):
    N = int(input())
    nums = list(map(int, input().split()))
 
    hsize = 0
    H = [0] * (N+1)
 
    # 힙 만들기
    for num in nums:
        enq(num)
 
    result = 0
    p = hsize//2  # 부모 노드
 	
    # 부모 노드가 존재할 때까지 루프
    while p:
        result += H[p]
        p = p // 2
 
    print(f'#{tc} {result}')