파이썬 알고리즘 042 | 최대힙

Yunny.Log ·2021년 1월 13일
0

Algorithm

목록 보기
42/318
post-thumbnail

42. 최대힙

최대힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드값이 왼쪽자식과 오른
쪽 자식노드의 값보다 크게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root)노드는
입력된 값들 중 가장 큰 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7순으로 입력되면
최대힙 트리는 아래와 같이 구성됩니다.
7
4 6
1 3 2 5
최대힙 자료를 이용하여 다음과 같은 연산을 하는 프로그램을 작성하세요.
1) 자연수가 입력되면 최대힙에 입력한다.
2) 숫자 0 이 입력되면 최대힙에서 최댓값을 꺼내어 출력한다.
(출력할 자료가 없으면 -1를 출력한다.)
3) -1이 입력되면 프로그램 종료한다.
▣ 입력설명
첫 번째 줄부터 숫자가 입력된다. 입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정
수형 범위에 있다.
▣ 출력설명
2) 연산을 한 결과를 보여준다.
▣ 입력예제 1
5
3
6
0
5
0
2
4
0
-1
▣ 출력예제 1
6
5
5

<내 풀이>

  • 어떻게 최대힙을 루트힙으로 지정하는지를 몰라서 풀지 못했다

<풀이>


import heapq as hq #heapqu는 기본적으로 최소힙으로 작동
a=[] #빈 리스트가 하나 필요
while True:
    n=int(input())
    if n==-1:
        break
    elif n==0 :
        if len(a)==0:
            print(-1)
        print(-hq.heappop(a))
    else :
        hq.heappush(a,-n) #최대 힙으로 받아주려면 숫자 앞에 '-'부호를 붙여주면 된다
        

<반성점>

  • 너무 생각을 덜한 것 같다

<배운 점>

  • import heapqu 는 기본적으로 최소힙으로 작용(루트힙에 최소값이 들어가는 것)
  • 따라서 최대 힙으로 바꿔주려면 최소힙으로 계속 가되, 받는 입력값에 마이너스 부호를 붙여주면 최대 값이 최솟 값이 되므로 그렇게 해주면 된다
  • 다만 출력할 때도 꼭 - 붙여서 원래 부호로 만들어주기

0개의 댓글