새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv3_이중우선순위큐

2022. 8. 6. 21:25

  • -

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

"""
입출력 예시)

operations = ["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] -> [0,0]
operations = ["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] -> [333, -45]
"""

import heapq

def solution(operations):
    answer = []
    heap = [] # 힙 생성

    for oper in operations:
      if oper[0] == 'I': # 명령어가 'I'인 경우
        heapq.heappush(heap, int(oper[2:])) # 공백 뒤의 숫자를 heap에 삽입 ('I' + (공백) + 숫자)
      
      else: # 명령어가 'D'인 경우
        if len(heap) == 0: # 힙이 비어있으면 pass (-> 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시)
          pass
        elif oper[2] == '-': # 공백 뒤에 '-'가 있는 경우
          heapq.heappop(heap) # heap에서 최솟값을 삭제
        else: # 공백 뒤에 바로 1이 오는 경우
          heap = heapq.nlargest(len(heap), heap)[1:] # heap에서 최댓값을 찾아서 이 최댓값을 제외하고 리스트 힙에 삽입
          heapq.heapify(heap) # 리스트 힙을 heap으로 변환

    if heap: # 힙이 비어있지 않으면
      answer.append(max(heap)) # 최댓값
      answer.append(min(heap)) # 최솟값
    else: # 힙이 비어있으면
      answer.append(0) 
      answer.append(0)

    return answer

 

 

  • heapq
    • heapq.heappush(heap, item) : item을 heap에 추가
    • heapq.heappop(heap) : heap에서 가장 작은 원소를 pop & 리턴, 비어 있는 경우 IndexError
    • heapq.heapify(x) : 리스트 x를 즉각적으로 heap으로 변환
  • 힙에서 최댓값 찾기
    • heapq.nlargest(n, iterable, key=None)
  • 힙에서 최솟값 찾기
    • heapq.nsmallest(n, iterable, key=None)

 

  • heapq 공식 문서

https://docs.python.org/ko/3/library/heapq.html

 

heapq — 힙 큐 알고리즘 — Python 3.10.6 문서

heapq — 힙 큐 알고리즘 소스 코드: Lib/heapq.py 이 모듈은 우선순위 큐 알고리즘이라고도 하는 힙(heap) 큐 알고리즘의 구현을 제공합니다. 힙은 모든 부모 노드가 자식보다 작거나 같은 값을 갖는

docs.python.org

 

 

 


 

  • operations=["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] 의 연산 과정
"""
1) I -45: -45 삽입 -> [-45]
2) I 653: 653 삽입 -> [-45, 653]
3) D 1: 최댓값(653) 삭제 -> [-45]
4) I -642: -642 삽입 -> [-642, -45]
5) I 45: 45 삽입 -> [-642, -45, 45]
6) I 97: 97 삽입 -> [-642, -45, 45, 97]
7) D 1: 최댓값(97) 삭제 -> [-642, -45, 45]
8) D -1: 최솟값(-642) 삭제 -> [-45, 45]
9) I 333: 333 삽입 -> [-45, 45, 333]
10) [-45, 45, 333]에서 최댓값과 최솟값 return -> [333, -45]
"""

 

 

 

 

 

참고)

 

https://littlefoxdiary.tistory.com/3

 

[Python] 힙 자료구조 / 힙큐(heapq) / 파이썬에서 heapq 모듈 사용하기

힙은 특정한 규칙을 가지는 트리로, 최댓값과 최솟값을 찾는 연산을 빠르게 하기 위해 고안된 완전이진트리를 기본으로 한다. 힙 property : A가 B의 부모노드이면 A의 키값과 B의 키값 사이에는 대

littlefoxdiary.tistory.com

 

https://velog.io/@norighthere/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Python-%EC%9D%B4%EC%A4%91%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%ED%81%90

 

[프로그래머스 / Python] 이중우선순위큐

🧑🏻‍💻 문제링크파이썬의 heapq 모듈은 기본적으로 Min Heap 구조를 갖는다. 그렇기 때문에 heappop()을 하게되면 가장 heap에서 최솟값을 빼게 된다.처음에 생각했던 방법은 max_heap, min_heap 두 개의

velog.io

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!