문제 링크 : 백준 13975번
각 파일을 합칠 때마다 발생하는 비용의 합을 최소로 해야하므로 합칠 때 비용이 가장 적은 것 2개를 반복적으로 합치면 된다.
이 때, 합치는 파일 2개는 삭제하고 합쳐져서 새롭게 탄생한 파일도 기존 파일과 동일하게 비교하여 가장 적은 것 2개를 합쳐야한다.
즉,
1. 기존 파일 중 가장 적은 파일 2개를 합쳐 새로운 파일을 만든다.
2. 합치는데 사용된 파일 2개를 삭제한다.
3. 파일이 2개 이상 남았으면 1번으로 간다.
K가 최대 1,000,000이므로 매번 정렬하여 구하면 시간초과가 발생한다.
퀵 정렬이라 가정 -> O(n logn)
따라서, 최소힙으로 만들어진 우선순위 큐를 사용하면 시간 안에 구할 수 있다.
힙 -> O(logn)
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int t;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> t;
while(t--) {
int k;
long long ans=0;
cin >> k;
priority_queue<long long, vector<long long>, greater<long long> > q;
for(int i=0 ; i<k ; i++) {
int a;
cin >> a;
q.push(a);
}
while(q.size() > 1) {
long long sum = q.top();
q.pop();
sum += q.top();
q.pop();
ans += sum;
q.push(sum);
}
cout << ans << "\n";
}
return 0;
}