프로그래머스 레벨 3 이중우선순위큐

yjkim·2023년 5월 1일
0

알고리즘

목록 보기
2/59

문제

이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.
명령어 수신 탑(높이)
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)]
profile
컴퓨터 공부

1개의 댓글

comment-user-thumbnail
2024년 5월 21일

코드에 반례 있습니다.

Input: ["I 10", "I 20", "I 30", "D -1", "D -1", "I 15", "D 1"]
Output: [20, 15]
정답: [15, 15]

답글 달기