백준/그리디
[백준] 13975번 파일 합치기3
2zreal
2024. 10. 7. 19:00
파일을 두 개씩 계속 합해서 가장 작은 값이 나오도록 하는 문제이다. 어떻게 하면 가장 작게 합칠 수 있을까??
문제해결방법
1. 우선순위 큐를 사용한다.
2. 가장 작은 값 두 개를 합치고 다시 우선순위 큐에 집어넣는다.
3. 두 개를 합친 값을 sum에 저장한다.
30 30 40 50 이렇게 있으면
가장 작은 두 개를 합치면 30+30이다.
합치고 다시 큐에 집어넣으면
큐의 상태는 40 50 60이 된다.
sum의 값은 60이다.
이 순서대로 계속 진행하면
40+50=90
sum=60+90
60 90(큐 상태)
60+90=150
sum=150+150
큐가 비었으면 while문 종료
30 30 40 50 -> 40 50 60 -> 60 90 -> 150
#include <iostream>
#include <queue>
using namespace std;
int main(void)
{
int T=0;
cin>>T;
for(int i=0; i<T; i++)
{
long long sum=0;
int N=0;
cin>>N;
priority_queue<long long> pq;
for(int i=0; i<N; i++)
{
long long num=0;
cin>>num;
pq.push(-num);
}
while(!pq.empty())
{
long long num1=-pq.top();
pq.pop();
long long num2=-pq.top();
pq.pop();
//cout<<num1+num2<<endl;
sum=sum+num1+num2;
if(pq.empty())
{
cout<<sum<<endl;
break;
}
pq.push(-(num1+num2));
}
}
return 0;
}