본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/02 이분탐색, 분할정복, 스택, 큐, 우선순위 큐

[우선순위 큐, 힙] 백준 1715번 카드 정렬하기 with Python3

by 금의야행 2021. 8. 16.

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

문제

 

내 풀이

import sys
import heapq

n = int(sys.stdin.readline())

heap = []

for i in range(n):
    heapq.heappush(heap, int(sys.stdin.readline()))


if len(heap) == 1:  # 1개일 경우 비교하지 않아도 됌
    print(0)
else:
    answer = 0
    while len(heap) > 1:  # 1개일 경우 비교하지 않아도 됌
        temp_1 = heapq.heappop(heap)  # 제일 작은덱
        temp_2 = heapq.heappop(heap)  # 두번 째로 작은덱
        answer += temp_1 + temp_2  # 두덱을 비교한 횟수를 answer에 넣어줌
        heapq.heappush(heap, temp_1 + temp_2)  # 더한 값을 다시 덱에 넣어줌
        # 이렇게 하면 계속해서 제일 작은 덱 두개를 합한 값을 비교횟수 answer 에 추가할수있다!

    print(answer)

출처:https://claude-u.tistory.com/341

해설

출처에 있는 풀이 과정을 참고해서 구현했다.

 

힙의 특성을 사용해 다시 비교값을 힙에 넣으면 알아서 제일 작은 덱을 뽑아 낼 수 있음을 처음엔 생각하지 못했다.

 

 

 

댓글