プログラマ

5043 ワード

質問する


問題の説明
デュアル・ユーティリティ・プリアンブル・キューとは、次の演算が可能なデータ構造です.

パラメータとして2つの優先順位キューで実行する演算操作を指定した場合、すべての演算を処理した後、キューが空の場合[0,0]空でない場合、「最値、最上昇値」を返すソルバを実装します.
せいげんじょうけん
  • 操作は、100000より長い文字列配列である.
  • 操作の要素は、キューが実行する操作を表す.
    要素はコマンドデータ形式で与えられます.最大値/最大値を削除する操作で複数の最大値/最大値がある場合は、1つだけ削除します.
  • 空のキューでデータの削除が要求された場合、この操作は無視されます.
  • にゅうしゅつりょく


    I/O例

    I/O例説明
    16を挿入すると、最大値が削除されます.[0,0]を返します.空ですから.
    7、5、および-5を挿入して、最大値を削除します.最大値7、最小値5を返します.

    コミットコード

    import heapq
    
    def solution(operations):
        answer = []
        q = []
    
        for operation in operations:
            o, num = operation.split()
           
    		# I일 경우 num 삽입
            if o == "I":
            	# num을 int로 바꾸지 않으면 음수에 대한 처리가 안됨.
                heapq.heappush(q, int(num))
                continue
            if q:
            	# 최소 힙으로 heappop 하면 됨.
                if num == "-1":
                    heapq.heappop(q)
                # q를 정렬하고 마지막 값을 제거했는데, 사실 이렇게 안하고 q.remove(max(q))이렇게 해줘도 됨.
                else:
                    q.sort()
                    q = q[:-1]
                    # 해당 배열을 heapify해줌.
                    heapq.heapify(q)
    
        if q:
            m_in = heapq.heappop(q)
            if q:
                m_ax = max(q)
                answer = [m_ax, m_in]
            # q에 값이 하나밖에 없던 상황, 최댓값과 최솟값이 같은 상황으로 다음과 같이 처리한다.
            else:
                answer = [m_in, m_in]
        else:
            answer = [0, 0]
        return answer