반응형
롯데V3
롯데 우승하는 그날까지 개발...ing
롯데V3
전체 방문자
오늘
어제
  • 분류 전체보기 (216)
    • Computer Science (0)
      • 운영체제 (0)
    • Problem Solving (160)
      • 프로그래머스 (93)
      • 백준 (60)
      • 리트코드 (2)
      • SQL (5)
    • 언어 (8)
      • 파이썬 (8)
    • 취준 (1)
      • 합격후기 (1)
    • 도서 리뷰 (21)
      • IT 도서 리뷰 (20)
      • 기타 도서 리뷰 (1)
    • 논문 리뷰 (1)
    • 회고 (5)
      • TIL (5)
    • 머신러닝 (9)
      • 통계 (3)
      • 전처리 (1)
      • 클러스터링 (3)
    • 딥러닝 (3)
      • 자연어처리 (1)
      • LLM (1)
    • 프로젝트 (5)
    • Util (0)
    • Tool (1)
      • Poetry (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • DP

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
롯데V3

롯데 우승하는 그날까지 개발...ing

Problem Solving/프로그래머스

이중우선순위큐 - 파이썬(Python)

2023. 5. 13. 13:11
728x90
반응형

문제 링크

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

 

프로그래머스

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

programmers.co.kr


문제 설명

이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.

명령어 수신 탑(높이)
I 숫자 큐에 주어진 숫자를 삽입합니다.
D 1 큐에서 최댓값을 삭제합니다.
D -1 큐에서 최솟값을 삭제합니다.

이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.


제한사항

  • operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
  • operations의 원소는 큐가 수행할 연산을 나타냅니다.
    • 원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
  • 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.

입출력 예

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

입출력 예 설명

입출력 예 #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]를 반환합니다.


풀이 과정

  • 우선순위 큐를 사용하기 위해 heapq 임포트
  • 디폴트가 min이므로 max는 따로 구현
    • 단순하게 마이너스로 새로 heapq만들어서 최대값 뺀 뒤에 다시 역으로 해서 돌려놓는다.

정답

import heapq

def get_min(q):
    min_q = heapq.heappop(q)
    
    return min_q, q 

def get_max(q):
    new_q = []
    for k in q:
        new_q.append(-k)
    heapq.heapify(new_q)
    max_q = heapq.heappop(new_q)
    new_new_q = []
    for k in new_q:
        new_new_q.append(-k)
    q = new_new_q
    heapq.heapify(q)    
    
    return -max_q, q

def solution(operations):
    answer = []
    q = []
    for idx, operation in enumerate(operations):
        
        oper, num = operation.split(" ")
        num = int(num)
        # 큐에 삽입
        if oper == "I":
            heapq.heappush(q, num)
        else:
            # 빈 큐는 무시
            if not q:
                continue
 
            # 최솟값 삭제
            if num == -1:
                min_q, q = get_min(q)
            # 최댓값 삭제
            else:
                max_q, q = get_max(q)

    if not q:
        return [0, 0]
    else:
        min_q, _ = get_min(q)
        max_q, _ = get_max(q)
        
        return [max_q, min_q]
728x90
반응형
저작자표시 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

숫자 게임 - 파이썬(Python)  (0) 2023.05.13
단속카메라 - 파이썬(Python)  (0) 2023.05.13
야근 지수 - 파이썬(Python)  (0) 2023.05.13
최고의 집합 - 파이썬(Python)  (0) 2023.05.13
시소 짝꿍 - 파이썬(Python)  (0) 2023.05.13
    'Problem Solving/프로그래머스' 카테고리의 다른 글
    • 숫자 게임 - 파이썬(Python)
    • 단속카메라 - 파이썬(Python)
    • 야근 지수 - 파이썬(Python)
    • 최고의 집합 - 파이썬(Python)
    롯데V3
    롯데V3

    티스토리툴바