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)
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 프린터 (파이썬) (0) | 2022.04.22 |
---|---|
[프로그래머스] 더 맵게 (파이썬) (0) | 2022.04.17 |
[BOJ] 18405번: 경쟁적 전염 (파이썬) (0) | 2022.04.16 |
[BOJ] 18352번: 특정 거리의 도시 찾기 (파이썬) (0) | 2022.04.16 |