BOJ/Python
[BOJ/백준] 1715 - 카드 정렬하기 (Python)
tjdms4327
2025. 1. 28. 15:42
문제
매우 많은 숫자 카드 묶음이 있을 때, 이들 중 두 묶음씩 골라 서로 합쳐나간다.
이때 최소 몇 번의 비교가 필요한가?
풀이
우선순위 큐를 사용하는 문제이다.
heapq는 파이썬의 힙 자료구조로 기본적으로 최소 힙을 구현한다.
haepify로 카드묶음을 최소 힙으로 변환한다.
heappop으로 카드 묶음 중 가장 작은 두 원소를 꺼내 합친다. 이 과정을 두 번씩 한다.
이 둘을 합쳐 비교 횟수에 더하고 4개의 원소가 빠진(2번의 과정이었으므로) card에 합을 추가한다.
마지막 비교까지(card 원소가 1개일 때) 위 과정을 반복한다.
코드
import sys
input=sys.stdin.readline
import heapq
n=int(input())
card=[int(input()) for _ in range(n)]
heapq.heapify(card) #최소 힙으로 변환
compare=0
while len(card)>1:
a=heapq.heappop(card) #최소 힙에서 가장 작은 원소 두 원소 꺼내 합치기
b=heapq.heappop(card)
compare+=(a+b)
heapq.heappush(card, a+b) #힙에 원소 추가
print(compare)