득이공간

[백준 C++] 1715 카드 정렬하기 - 그리디 본문

PS/알고리즘 문제풀이

[백준 C++] 1715 카드 정렬하기 - 그리디

쟁득 2024. 2. 5. 11:57
 

1715번: 카드 정렬하기

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

priority_queue<int, vector<int>, greater<int>> Cards;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		int Card;
		cin >> Card;
		Cards.emplace(Card);
	}

	int Cnt = 0;
	for (int i = 0; i < N - 1; ++i)
	{
		int First = Cards.top();
		Cards.pop();

		int Second = Cards.top();
		Cards.pop();

		int NewCard = First + Second;
		Cards.emplace(NewCard);

		Cnt += NewCard;
	}

	cout << Cnt;
}

 

카드 묶음을 합칠 때 매번 값이 가장 작은 두 카드묶음을 선택하도록 푸는 문제입니다.

따라서 오름차순 우선순위 큐를 이용해서 간단하게 풀 수 있습니다.

주의할 점은 합친 카드묶음을 큐에 다시 넣어주어야 합니다.