알고리즘

[BOJ] 1715번: 카드 정렬하기 (파이썬)

김해리 2022. 4. 17. 09:45

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

 

1715번: 카드 정렬하기

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

www.acmicpc.net


보유하고 있는 카드 묶음 중에 가장 작은 두 개의 묶음을 비교해야 최소 횟수로 비교할 수 있습니다.

 

첫번째 원소가 항상 제일 작은 값이 되도록 유지하는 heapq 라이브러리를 사용합니다. 비교가 필요한 카드 묶음을 heapq에 넣어 관리합니다.

가장 작은 묶음과 그 다음으로 작은 묶음을 꺼내어 비교하고, 하나가 된 카드 묶음을 다시 heapq에 넣습니다.

카드 묶음이 1개 남을 때까지 반복합니다.

 

import sys
import heapq

n = int(sys.stdin.readline().strip())
deck = [int(sys.stdin.readline().strip()) for _ in range(n)]

if len(deck) == 1:
    print(0)
else:
    answer = 0
    heapq.heapify(deck)
    while len(deck) > 1:
        first = heapq.heappop(deck)
        second = heapq.heappop(deck)
        current = first + second
        answer += current
        heapq.heappush(deck, current)
    print(answer)
반응형