이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.
명령어 | 수신 탑(높이) |
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 |