알고리즘/BOJ

[BOJ] 1715 - 카드 정렬하기

서노리 2022. 1. 26. 02:02
반응형

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

 

1715번: 카드 정렬하기

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

www.acmicpc.net

import sys
import heapq

n = int(input())

heap = []
for i in range(n):
    data = int(sys.stdin.readline())
    heapq.heappush(heap, data)
    
result = 0

while len(heap) != 1:
    one = heapq.heappop(heap)
    two = heapq.heappop(heap)
    
    sum = one + two
    result += sum
    heapq.heappush(heap, sum)
    
print(result)

이 문제의 핵심 아이디어는 항상 가장 작은 크기의 두 카드 묶음을 합쳤을 때 최적의 해를 보장한다는 점이다.

따라서 이 문제는 우선순위 큐를 이용한 그리디 알고리즘 유형이라고 볼 수 있다.

 

우선순위 큐를 이용하면 우선순위 큐에 원소를 넣었다 빼는 것만으로도 정렬된 결과를 얻을 수 있다. 따라서 항상 가장 작은 두 개의 값을 꺼내어 그 합을 결과에 더해주고 합을 다시 우선순위 큐에 넣는 것을 반복하면 된다.

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 1654 - 랜선 자르기  (0) 2022.02.02
[BOJ] 2108 - 통계학  (0) 2022.01.28
[BOJ] 10825 - 국영수  (0) 2022.01.25
[BOJ] 18405 - 경쟁적 전염  (0) 2022.01.22
[BOJ] 14502 - 연구소  (0) 2022.01.19