[Python][algorithm] 최소힙 추가 삭제 + (swea 5177번 : 이진힙)
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}')