-
[힙] 이중 우선순위 큐코딩 테스트/프로그래머스 2023. 3. 29. 21:03
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/42628
문제 풀이
- operation에 따라 삽입/ 최댓값 pop/ 최솟값 pop을 하는 문제
- 각 op에 따라 split로 나눠 준 뒤 각 연산을 수행
- 우선순위 큐로 짬
- heapq 는 push와 동시에 정렬을 수행함 (기본적으로 최대 정렬-최솟값이 맨 앞으로)
- 파이썬에서 제공하는 heapq의 기본은 최소 힙을 기반으로 하고 있어서 pop을 할 시 최솟값이 나옴
- 최댓값은 큐의 맨 뒤에 있으므로 D 1이면 q.pop()을 수행
- 주의할 점은, D 연산을 수행 할 시 q가 비워져있으면 에러를 내므로 continue 조건을 달아줘야 함
오답노트
- 정답을 출력할 때, 최댓값을 q[-1]로 했는데 실패했음
- 최소 힙은 부모 노드가 자식 노드보다 작은 것을 유지하는 것이므로 q[0]이 최솟값이 될 순 있어도 q[-1]이 최댓값인 것을 보장하진 않음
- 따라서 최소 힙에서의 최댓값을 찾을려면 모든 요소를 순회 해야함. max(q)로 대체
소스 코드
import heapq def solution(operations): answer = [] q=[] for op in operations: a,b = op.split(" ") if(a=="I"): heapq.heappush(q,int(b)) elif not q: #빈 q에서 pop은 에러를 냄 continue elif(b=="-1"): heapq.heappop(q) else: q.pop() print(q) if not q: answer=[0,0] else: answer=[max(q),q[0]] return answer if __name__=='__main__': t=[] for i in range(9): t.append(input().rstrip()) solution(t)
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[동적 계획법] 등굣길 (0) 2023.03.31 [DFS/BFS] 단어 변환 (0) 2023.03.30 [DFS/BFS] 네트워크 (0) 2023.03.30 [연습 문제] 최고의 집합 (0) 2023.03.29 [동적 계획법] 정수 삼각형 (0) 2023.03.29