#11279 최대 힙

princess·2021년 1월 14일
0

알고리즘

목록 보기
9/21

💯 문제 → 최대 힙을 이용하는 문제인데, 만약 들어온 수가 0인 경우에는 정렬된 최대힙의 루트를 삭제하고 그 값을 출력하는 문제인듯 !

<💭 방법>

🎈 1 최대힙 사용하는 방법

  • 파이썬에는 최대 힙이 없어 최소힙을 응용하여 사용함
heap_items = [2, 8 , 7 , 5 , 3]

max_heap = []
for i in heap_items:
  heapq.heappush(max_heap, (-i, i))
  #-i로 정렬을 하고 i는 힙에 실제 들어 가는 숫자
  • 만약 들어온 수가 0일경우에는 삭제를 하고 그 값을 출력 시킴

<😥 첫번째 코드>

def Max_Heap(heap_items):
    global n
    
    Max_heap = []
    for i in range(n):
        if heap_items[i] != 0:
            heapq.heappush(Max_heap, (-heap_items[i], heap_items[i]))

        else:
            if not Max_heap:
                print(0)
            
            else:
                print(heapq.heappop(Max_heap)[1])

n = int(input())

heap_items = []
for i in range(n):
    heap_items.append(int(input()))

Max_Heap(heap_items)
  • 입력을 들어온 대로 배열로 받고 함수로 그 배열을 전달
  • 전달된 배열의 원소에 0이 아닐 경우 바로 최소힙으로 구현하는 최대힙방식으로 추가
  • 0일 경우 힙이 비어있냐에 따라 출력값을 다르게 해줌

안된 이유 : 실행 결과 결과값은 모두 정확하나, 시간 초과가 뜸 ..

<😍 두번째 코드>

for i in range(n):
    heap_items.append(int(sys.stdin.readline()))
  • 위 코드와 완전 유사하지만 입력 받는 방식을 다르게함
  • input을 이용 하는 것이 아니라 더 빠른 방식인 readline을 이용하여 구현

느낀점

정말 이번 문제는 어이가 없었다 .. 정답은 정확하게 나오나 계속해서 시간초과라고 뜸 ㅠㅠ 결국엔 ,,, 혼자 해결을 못해서 구글로 찾아 봤더니 뭔가 사람들이 다 짠것 처럼 모두 readline을 사용하고 있었다 ,, 진짜 혹시나 하는 마음에 고쳐본 결과 ,, 맞았습니다 ,, ㅠㅠ 몰랐던 것을 하나 더 알고 가지만 너무 억울한 느낌 ,, 다음번에도 이거 써먹어야지 ㅎㅎ

profile
성장하는 머신러닝 엔지니어

0개의 댓글