Writer : Harim Kang
우선순위 큐를 위해서 만들어진 자료구조로, 완전 이진 트리의 일종입니다.
여러 값들 중에서, 최댓값 또는 최솟값을 빠르게 찾도록 O(logn) 만들어진 자료구조입니다.
파이썬에서는 heapq 내장 라이브러리를 통해서 최소 힙을 제공합니다.
import heapq
부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리를 의미합니다.
heapq.heappush(a, b) : a 배열을 힙으로 하여 b원소를 넣습니다.
heapq.heappop(a) : a 배열의 최솟값을 꺼냅니다.
해당 포스팅에서 푸는 문제는 아래의 4문제입니다.
해당 문제들은 프로그래머스의 코딩테스트 연습 > 코딩테스트 고득점 kit > 힙에 모여있는 4문에 입니다.
https://programmers.co.kr/learn/courses/30/parts/12117
https://programmers.co.kr/learn/courses/30/lessons/42626
스코빌 지수를 모두 힙에 삽입합니다.
반복문을 돌면서 가장 작은 지수를 하나 꺼냅니다.
이때, 꺼냈더니 힙이 비어있고(마지막 수라는 뜻) 해당 값이 기준인 k보다 작은 경우는 문제를 해결할 수 없는 경우이기 때문에 -1을 리턴합니다.
if len(heap) < 1 and current < K:
answer = -1
break
위의 예외사항이 아닌 경우(계산이 가능한 경우)에는 현재의 스코빌 지수가 기준 이상인지를 판단합니다. 기준 이상인 경우에는 가장 작은 값이 기준 보다 큰 경우 이므로 나머지도 기준 이상이기때문에 해결이 완료된 것입니다.
현재 값이 기준 미만이면, 다음으로 작은 값을 힙에서 꺼내서 계산하여 다시 넣습니다.
import heapq
def solution(scoville, K):
answer = 0
heap = []
for h in scoville:
heapq.heappush(heap, h)
while True:
current = heapq.heappop(heap)
if len(heap) < 1 and current < K:
answer = -1
break
if current >= K:
break
else:
answer += 1
next_node = heapq.heappop(heap)
heapq.heappush(heap, current + next_node*2)
return answer
sc = [1, 2, 3, 9, 10, 12]
k = 7
print(solution(sc, k))
https://programmers.co.kr/learn/courses/30/lessons/42629
import heapq
def solution(stock, dates, supplies, k):
answer = 0
pq = []
i = 0
while stock < k:
# 목표 : 재고가 k 이상이면 밀가루가 충분
# 현재 재고가 k보다 작을 때
while i < len(dates) and dates[i] <= stock:
# 해당 반복문에는 반드시 1번은 들어온다. (제한 조건에 의해)
# 날짜를 증가 시키면서 공급일보다 stock 이 커질 때
# 즉, 공급일에 도달하면 해당 공급량을 heap 에 push 한다.
heapq.heappush(pq, -supplies[i])
i += 1
# 현재 공급일까지의 공급량 중 가장 큰 수를 추가
# 해당 공급량이 부족하면 반복
stock += -heapq.heappop(pq)
answer += 1
return answer
https://programmers.co.kr/learn/courses/30/lessons/42627
한 번에 하나의 작업만을 수행가능한 하드디스크의 디스크 컨트롤러를 구현합니다.
아래와 같이 작업 요청이 들어옵니다.
이때 각 작업의 요청부터 종료까지 걸린 시간의 평균 최솟값을 찾는 문제입니다.
위의 예제의 경우, 아래의 방법이 최솟값일 때의 순서입니다.
- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms)
- C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms)
- B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)
- 평균 : (3+7+17)/3 = 9ms
import heapq
def solution(jobs):
n = len(jobs)
# jobs 를 p_queue 로 변경 --> jobs 가 들어오는 순서대로 정렬된다.
heapq.heapify(jobs)
# 맨 처음꺼 꺼내보겠음 --> 젤 처음 시작하는게 나오겠지>?
current, length = heapq.heappop(jobs)
answer = 0
pq = []
# pq 라는 큐를 하나 더 사용해보겠음, 이건 현재 값에서 작업 길이를 추가한 걸로 정렬
# 즉, 예측했을 때 결과 값을 오름차순
# 맨처음 꺼를 pq에 넣어보겠음
heapq.heappush(pq, (current + length, current, length))
while pq:
# pq에 있는 첫번째꺼(계산 값이 젤 작은 거)를 꺼냅니다.
# current 는 선택한 작업이 끝난 시점
current, start, length = heapq.heappop(pq)
# answer 계산
answer = answer - start + current
while pq:
# 여기 반복문은 pq를 비우고 jobs 에 채웁니다.
_, c, d = heapq.heappop(pq)
heapq.heappush(jobs, [c, d])
while jobs:
# jobs 에 남은 작업 중에 시작점이 current 보다
# 작은 것들을 빼서 pq에 계산해서 넣어보겠슴
if jobs[0][0] > current:
# jobs 중 젤 작은게 current 보다 작아지면 반복문을 벗어나
if not pq:
# 만약에 pq가 비었는데 jobs 는 존재할때,
# 즉, 도착한 작업이 없고 대기 작업은 존재할때
e, f = heapq.heappop(jobs)
heapq.heappush(pq, (e+f, e, f))
break
else:
# current 보다 시작점이 작으면 가능한 경우이기 때문에 pq에 넣어봄
a, b = heapq.heappop(jobs)
heapq.heappush(pq, (current + b, a, b))
answer /= n
# 마무리
return int(answer)
https://programmers.co.kr/learn/courses/30/lessons/42628
import heapq
def solution(operations):
pq = []
max_pq = []
def insert(num):
heapq.heappush(pq, num)
heapq.heappush(max_pq, -num)
def delete(a, b):
# a 가 max_pq 이고, b가 pq 이면 최댓값 삭제
# 반대의 경우엔 최솟값 삭제
if a and b:
target = -heapq.heappop(a)
temp = []
while b:
c = heapq.heappop(b)
if target == c:
break
else:
temp.append(c)
if temp:
for d in temp:
heapq.heappush(b, d)
for op in operations:
op = op.split()
op[1] = int(op[1])
if op[0] == 'D':
if op[1] == 1:
delete(max_pq, pq)
elif op[1] == -1:
delete(pq, max_pq)
elif op[0] == 'I':
insert(op[1])
if pq:
min_num = heapq.heappop(pq)
max_num = -heapq.heappop(max_pq)
else:
min_num, max_num = 0, 0
answer = [max_num, min_num]
return answer
[파이썬] 코딩테스트 문제 풀이 - 정렬 문제 (프로그래머스) (0) | 2020.04.23 |
---|---|
[파이썬] 코딩테스트 문제 풀이 - 스택/큐 문제 (프로그래머스) (0) | 2020.03.27 |
[파이썬] 코딩테스트 문제 풀이 - 해쉬 문제 (프로그래머스) (0) | 2020.03.22 |
파이썬으로 구현하는 자료구조 요약 정리 - 해쉬 테이블(Hash Table) (1) | 2020.01.30 |
파이썬으로 구현하는 자료구조 요약 정리 - 배열(Array), 큐(Queue), Stack, Linked List (1) | 2020.01.22 |