입출력 예 #1
16과 -5643을 삽입합니다.
최솟값을 삭제합니다. -5643이 삭제되고 16이 남아있습니다.
최댓값을 삭제합니다. 16이 삭제되고 이중 우선순위 큐는 비어있습니다.
우선순위 큐가 비어있으므로 최댓값 삭제 연산이 무시됩니다.
123을 삽입합니다. 최솟값을 삭제합니다. 123이 삭제되고 이중 우선순위 큐는 비어있습니다. 따라서 [0, 0]을 반환합니다.
입출력 예 #2
-45와 653을 삽입후 최댓값(653)을 삭제합니다. -45가 남아있습니다.
-642, 45, 97을 삽입 후 최댓값(97), 최솟값(-642)을 삭제합니다. -45와 45가 남아있습니다. 333을 삽입합니다. 이중 우선순위 큐에 -45, 45, 333이 남아있으므로, [333, -45]를 반환합니다.
nlargest()
와 nsmallest()
함수를 사용해 최대 또는 최소값을 찾을 수 있다.heapq.nlargest(n, iterable, key=None) heapq.nsmallest(n, iterable, key=None)
가장 큰 최대값이 제외
된다.heap = heapq.nlargest(len(heap), heap)[1:] heapq.heapify(heap) heapq.nlargest(n, list)```
import heapq as hq def solution(operations): answer=[] heap=[] for op in operations: # 첫글자가 "I"일 때, 세번째부터 [heap]에 추가 if op[0] == "I": hq.heappush(heap, int(op[2:])) else: if len(heap) == 0: # heap 요소의 개수가 =0이면, pass pass # 세번째가 "-"이면 최솟값 삭제 # heappop : 가장 작은 원소를 삭제 후에 그 값을 리턴 elif op[2] == "-": hq.heappop(heap) else: #nlargest()와 nsmallest() 함수를 사용해 최대 or 최소값을 찾을 수 있음 #nlargest(n, iterable, key=None) heap = hq.nlargest(len(heap), heap)[1:] # 누군가 최댓값을 내놓으라 한다면 # 주저없이 최상단레벨의 root 노드인 10을 내어주면 된다. # 10이 나가고 나면 트리가 깨진다. # 이때 나중에 또 최댓값을 내놓으라 할 수 있으니, 다시 힙 형태로 바꿔놓자. heapify() hq.heapify(heap) if heap: answer.append(max(heap)) answer.append(min(heap)) else: answer.append(0) answer.append(0) return answer
💡check point
heapq.nlargest()
부가설명import heapq as hq heap = [8, 3, 4, 1, 7, 10] heap = hq.nlargest(len(heap), heap)[2:] print(heap)
- 예시
1)heap = hq.nlargest(len(heap), heap)
→ 출력값 : 내림차순 정렬 [10, 8, 7, 4, 3, 1]
2)heap = hq.nlargest(len(heap), heap)[0:]
→ 출력값 : [10, 8, 7, 4, 3, 1]
3)heap = hq.nlargest(len(heap), heap)[1:]
→ 출력값 : 맨 앞 숫자 슬라이싱 후, [8, 7, 4, 3, 1]
4)heap = hq.nlargest(len(heap), heap)[2:]
→ 출력값 : 맨 앞 숫자 2개 슬라이싱 후, [7, 4, 3, 1]
처음 heapppush()를 할 때, int()로 정수 변환해서 push해주지 않았더니 계속 오류가 났었다. 왜 오류가 났는지 한참 찾았는데, 완전 어이없고 사소한 실수였다, 실수하지 말자!
hq.heappush(heap, 💡int(i[2:]))