본문 바로가기
개발/Algorithm

[프로그래머스/42628/level3/고득점kit] 이중우선순위큐 - 최소힙,최대힙

by 킴과다페인(chae eun kim) 2023. 9. 2.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42628

 

내 풀이 - 최소힙, 최대힙 둘다 만들기

  • 조건
    • 명령어 : [명령어, 숫자]
    • 모든 연산을 처리한 후 큐가 비어있으면 [0,0]
    • 큐가 비어있지 않으면 [최댓값, 최솟값]을 return
  • 내 아이디어 : 최소힙, 최대힙 두 가지 자료구조를 만들어서 명령어에 따라 다르게 처리하기
    • 이렇게 푼 사람들도 있고, 리스트 max함수로 그때그때 최댓값 연산 하는 사람도 있음
'''
- 명령어 : [명령어, 숫자]
- 모든 연산을 처리한 후 큐가 비어있으면 [0,0]
- 큐가 비어있지 않으면 [최댓값, 최솟값]을 return
- 아이디어 : 최소힙, 최대힙 두 가지 자료구조를 만들어서 명령어에 따라 다르게 처리하기
- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
'''

import heapq

def solution(operations):
    answer = []
    min_heap = [] #최소힙
    max_heap = [] #최대힙

    for o in operations:
        d = o.split()

        if d[0] == "I":
            heapq.heappush(min_heap, int(d[1])) #최소힙
            heapq.heappush(max_heap, -int(d[1])) #최대힙
        else:
            if min_heap:
                if d[1] == "1":
                    #최댓값을 삭제
                    min_heap.remove(-heapq.heappop(max_heap))
                else:
                    #최솟값을 삭제
                    max_heap.remove(-heapq.heappop(min_heap))
    if min_heap:
        return [-heapq.heappop(max_heap), heapq.heappop(min_heap)]
    else:
        return [0, 0]