이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.
명령어 수신 탑(높이)
I 숫자 큐에 주어진 숫자를 삽입합니다.
D 1 큐에서 최댓값을 삭제합니다.
D -1 큐에서 최솟값을 삭제합니다.
이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.
솔직히 문제 이름에서 접근법을 대충 유추할 수 있었음.
힙 두개를 하나는 최소힙, 하나는 최대힙으로 각각 생성해준후
최소 원소 삭제면 최소힙에서 삭제,
최대 원소 삭제면 최대힙에서 삭제하는 방법으로 문제를 풀었음
이때, 전체 원소의 갯수가 담긴 변수 length를 선언해준 후,
I 명령어가 오면 length+=1
D 명령어가 오면 length-=1을 해주었음
그렇게 해서 length가 <=0일 경우, 큐가 비어있다는 소리니까
무조건 [0,0] 반환
그리고 length 가 1 이상일 경우 maxheap 에서 pop, minheap에서 pop해줘서 반환.
근데 이경우 테스트케이스 1번에서 에러가 나는데, 그이유는 다음과 같음
1,1,1,1 넣고나서 d1 d1 d-1 d-1 5,6 넣어주면
5랑 6을 반환해야 하는데 엉뚱한 값을 반환해준다.
length가0일때 리스트를 비워주는 방식을 사용하니까 해결됨
전체코드
import heapq
def solution(operations):
minheap=[]
maxheap=[]
length=0
for oper in operations:
if length==0:
minheap=[]
maxheap=[]
op=oper.split(' ')
if op[0]=='I':
heapq.heappush(minheap,int(op[1]))
heapq.heappush(maxheap,-int(op[1]))
length+=1
elif length>0:
length-=1
if op[1]=='1':
heapq.heappop(maxheap)
else:
heapq.heappop(minheap)
if length<=0:
return [0,0]
else:
return[-heapq.heappop(maxheap),heapq.heappop(minheap)]