알고리즘

[Lv.3] 프로그래머스 - 이중우선순위큐

뚜벅-뚜벅 2021. 6. 26. 00:04

[접근]

처음엔 최소힙과 최대힙을 두 개 만들어서 각각 연산했는데, 그럴필요가 없었다.

heapq 라이브러리에 최댓값을 조회하는 메소드가 있다.

heapq.nlargest( n , list ) # list 중에서 가장 큰 값 n 개 조회

반대로 가장 작은 값 n 개 조회는 heapq.smallest(n,list) 이다

=> 따라서 힙 길이만큼을 조회하면 전체 인자가 내림차순으로 정렬된다.

=> 인덱스 1부터 슬라이싱 하면 최댓값이 제외된 나머지 리스트가 되고 이를 다시 heapify 한다.

import heapq
def solution(operations):
    answer = []
    hq = []
    heapq.heapify(hq)
    for oper in operations:
        op = oper.split()
        if op[0] =="I":
            heapq.heappush(hq,int(op[1])) #오름차순
        elif op[0] =="D" and op[1] == '1' : #최댓값삭제
            if hq:
                hq = heapq.nlargest(len(hq),hq)[1:]
                heapq.heapify(hq)
        elif op[0] =="D" and op[1] == '-1': # 최솟값 삭제
            if hq:
                heapq.heappop(hq)

    if hq:
        answer.append(heapq.nlargest(1,hq)[0])
        answer.append(heapq.heappop(hq))
    else:
        answer = [0,0]

    return answer

 

* 주의할 점 1) operation의 경우문자열을 split 했기에 조건문에서 int 화하든지 문자열과 비교해야한다.

                2) 힙안에 원소가 있을 때만 명령을 수행하도록 조건을 두지 않으면 런타임 에러가 발생한다.