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

Hesoyam·2020년 12월 10일
0

내용

이중 우선순위 큐는 입력된 명령어에 다음 연산을 하는 자료구조 입니다.

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

모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.


제한사항

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

입출력 예

operations return
[I 16,D 1] [0,0]
[I 7,I 5,I -5,D -1] [7,5]

사용 코드

import heapq

def solution(operations) :
    count =0  
    stack_result = []
    heap_min_result, heap_max_result= [], []
    for operation in operations :    # 명령어는 앞에 위치하기 때문
        oper_command, oper_number = operation.split() 
        if oper_command == 'I' :  # heap push 작업
            count +=1
            stack_result.append(int(oper_number))
        elif oper_command  == 'D' : # 삭제 작업
            if count == 0  :  # 비어있는 큐일때 
                continue
            count-=1
            if oper_number == '-1' : # 최소값 삭제
                heap_min_result = stack_result[:] 
                heapq.heapify(heap_min_result)
                stack_result.remove((heapq.heappop(heap_min_result) ) )

            else :  # 최대 값 삭제
                heap_max_result =list(map( lambda x:-x , stack_result[:]  ))
                heapq.heapify(heap_max_result)
                stack_result.remove(-(heapq.heappop(heap_max_result) ) )
                    
    heap_min_result,heap_max_result = stack_result[:] ,list(map( lambda x:-x , stack_result[:]  ))
    heapq.heapify(heap_min_result)
    heapq.heapify(heap_max_result)
    if count ==0 : # 힙이 비어져 있는 경우
        return [0,0]
    else : 
        return [-(heap_max_result[0]) , heap_min_result[0] ]

코드 설명

  1. 최대힙최소힙을 구현할 리스트(heap_min_result, heap_max_result)를 생성한 후 명령어가 문자열이므로 split()해서 숫자 부분과 영어 부분을 구분한다.
    ex) "D 5" => oper_command =D , oper_number = 5

  2. 최대힙최소힙의 내용을 동기화 해주기 위해서 또다른 리스트를 하나 생성한 후 명령어를 할 때마다 초기화를 해주어서 최대힙최소힙의 내용을 동기화 시켜준다.
    여기서 최소힙 같은 경우 값을 넣을때 별다른 작업을 안해도 되지만 최대힙은 "추가"에서 적은 원리를 적용해서 map 함수에서 lambda 함수를 사용해 heapq에 들어가는 값에 -를 붙여서 최대힙을 구현해주면 된다.

  • 추가 : heapq로 최대힙 구현 방법의 원리를 설명해 보면 a라는 리스트에 [1,7,2,3,8]이 들어 있는 경우 이 값을 heapq에 넣을시 해당 리스트에 가장 작은 값이 출력이되므로 1이 출력이 된다.
    그렇다면 저 리스트를 heapq에 넣을때 "-"가 붙은 채로 넣을경우를 생각해보자
  • "-"가 들어가면 [-1, -7, -2, -3, -8]이 된다. 이제 여기서 pop을 할 경우 -8이 출력되고 그 다음 -7, -3 ... 순서대로 출력이 된다 여기서 다시 "-" 연산을 해주면 8, 7, 3, 2 ... 와 같이 최대값이 출력이 된다.

profile
거북이가 되고 싶은 자라

0개의 댓글