coding test

[파이썬] 이중우선순위큐

잔망루피 2021. 4. 16. 20:15

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

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

이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [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]

 

입출력 예 설명

16을 삽입 후 최댓값을 삭제합니다. 비어있으므로 [0,0]을 반환합니다.
7,5,-5를 삽입 후 최솟값을 삭제합니다. 최대값 7, 최소값 5를 반환합니다.

출처

 

 

👩 나의 풀이

 

from collections import deque
def solution(operations):
    answer = deque()
    for o in operations :
        if answer :		# 큐에 원소가 있으면
            if o == "D 1" :
                answer.remove(max(answer))   # 최댓값 삭제
            elif o == "D -1" :
                answer.remove(min(answer))   # 최솟값 삭제
            else :
                answer.append(int(o[2:]))
        elif o[0] == "I" :
            answer.append(int(o[2:]))
    # answer에 원소가 없으면 [0,0], 있으면 [최댓값, 최솟값] 리턴        
    return [0,0] if not answer else [max(answer), min(answer)]

 

 

operations의 명령어에 따라 삭제 또는 추가를 한다.

숫자를 삽입할 경우 몇자리 수인지 정해져있지 않아서 인덱스 2부터 끝까지 슬라이싱했다.

int로 변환 후 삽입해야 한다.

큐에 원소가 남아있으면 [최댓값, 최솟값]을 리턴해야하는데 문제를 제대로 안 읽어서 모두 리턴하고 코드 잘못 된줄..🤛

 

 

👱‍♂️ 다른 사람 풀이

 

# 출처 : https://codedrive.tistory.com/54
def solution(operations):
    answer = []
    for i in operations :
        a, b=i.split(" ")   # 공백을 기준으로 나누기 
        if a == "I" :
            answer.append(int(b))	# 삽입
        else :
            if len(answer) > 0 :
                if b == "1" :	
                    answer.pop()	# 최댓값 삭제
                else :
                    answer.pop(0)	# 최솟값 삭제
            else :
                pass	# 아무것도 안 함
        answer.sort()
    if len(answer) == 0 :
        return [0, 0]
    else :
        return [max(answer), min(answer)]

 

리스트 이용.

조건 검사가 끝난 후에 정렬을 해준다.

 

✍ 새로 알게 된 점

pass

아무것도 안 한다.

continue는 밑에 코드 건너띄고 다음 반복으로 넘어감

 

 

# 출처 : https://codedrive.tistory.com/54
import heapq

def solution(operations) :
    h=[]
    for i in operations :
        a, b=i.split(" ")
        if a == "I" :		# 삽입
            heapq.heappush(h, int(b))
        else :		# 삭제
            if len(h) > 0 :
                if b == "1" :
                    h.pop(h.index(heapq.nlargest(1, h)[0]))
                else :
                    heapq.heappop(h)
            else :
                pass
    if len(h) == 0:
        return [0, 0]
    else :
        return [heapq.nlargest(1, h)[0], heapq.nsmallest(1, h)[0]]

 

힙으로 구현.

파이썬에 내장된 heap은 최소힙이다.

 

✍ 새로 알게 된 점

heapq.nlargest(n, iterable, key=None)
heapq.nsmallest(n, iterable, key=None)

힙에서 최댓값 또는 최솟값을 구한다.

n은 반환할 최댓값/최솟값 갯수

 

 

 

문제 출처 💁‍♂️ 프로그래머스

 

반응형

'coding test' 카테고리의 다른 글

[파이썬, Java] 입국심사  (0) 2021.04.17
[파이썬] 여행경로  (0) 2021.04.17
[파이썬, Java] 가장 먼 노드  (0) 2021.04.07
[파이썬] 정수 삼각형  (0) 2021.04.06
[파이썬] 섬 연결하기  (0) 2021.04.06