문제
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
풀이
그리디, 우선순위 큐
카드 수가 가장 적은 2개의 묶음을 합치는 방식으로 해결할 수 있다. 이 때, 2개의 묶음을 선택하기 위해, 우선순위 큐를 사용한다.
- 카드 수가 가장 적은 2개의 묶음을 합친다.
- 합쳐진 묶음을 다시 우선순위 큐에 넣는다.
- 모든 카드 묶음이 합쳐질 때까지 반복
코드
#include <iostream>
#include <queue>
using namespace std;
// 오름차순 우선순위 큐
priority_queue<int, vector<int>, greater<int>> pq;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
int temp;
cin >> temp;
pq.push(temp);
}
// 카드 수가 가장 적은 2개의 묶음을 합친다.
// 합쳐진 묶음을 다시 우선순위 큐에 넣는다.
// 모든 카드 묶음이 합쳐질 때까지 반복
int answer = 0;
while (pq.size() > 1)
{
int deck1 = pq.top();
pq.pop();
int deck2 = pq.top();
pq.pop();
answer += (deck1 + deck2);
pq.push((deck1 + deck2));
}
cout << answer;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 1439: 뒤집기 (0) | 2024.01.31 |
---|---|
[백준][C++] 1789: 수들의 합 (0) | 2024.01.30 |
[백준][C++] 13305: 주유소 (0) | 2024.01.27 |
[백준][C++] 2217: 로프 (0) | 2024.01.26 |
[백준][C++] 5585: 거스름돈 (1) | 2024.01.25 |