[BOJ] #1715 - 카드 정렬하기
2021. 6. 18. 16:17ㆍProblem Solving/Online Judge
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
** 문제 유형
- 힙, 자료구조, 그리디
** 풀이
- 가장 크기가 작은 숫자 카드 묶음들을 먼저 합쳤을 때, 비교 횟수가 가장 적음
- (10, 20, 40) ---30---> (30, 40) ---70---> (70)
- (40, 10, 20) ---50---> (50, 20) ---70---> (70)
- 가장 크기가 작은 숫자 카드 묶음들을 2개씩 합치기 위해, 힙 자료구조를 이용
import heapq
n = int(input())
heap = []
rslt = 0
for _ in range(n):
data = int(input())
heapq.heappush(heap, data) # 최소 힙 구조
while len(heap) != 1: # 힙에 원소가 1개 남을 때까지
first = heapq.heappop(heap) # 가장 작은 수부터 꺼냄
second = heapq.heappop(heap)
heapq.heappush(heap, first + second)
rslt += first + second
print(rslt)
'Problem Solving > Online Judge' 카테고리의 다른 글
[BOJ] #1260 - DFS와 BFS (0) | 2021.06.19 |
---|---|
[BOJ] #1766 - 문제집 (0) | 2021.06.18 |
[BOJ] #1926 - 최소 힙 (0) | 2021.06.18 |
[BOJ] #2250 - 트리의 높이와 너비 (0) | 2021.06.18 |
[BOJ] #1991 - 트리 순회 (0) | 2021.06.18 |