Mini

백준 1715 카드정렬하기 c++ // 우선순위큐, 그리디, 허프만코드 본문

Algorithm/우선순위큐

백준 1715 카드정렬하기 c++ // 우선순위큐, 그리디, 허프만코드

Mini_96 2024. 3. 24. 02:51

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

 

1715번: 카드 정렬하기

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

www.acmicpc.net

 

1. 의사코드

1. 최소값을 2개씩더하고, q에넣기, 정답에 더하기 하면된다

이방법이 왜 최적인지는 허프만코드 알고리즘과 동일하므로 이를 참고하면 된다.

 

2. 내코드

#include <bits/stdc++.h>

using namespace std;

int ret,n;
priority_queue<int,vector<int>,greater<int>> pq;

int main() {
	cin.tie(0);

	cin >> n;
	while (n--) {
		int tmp;
		cin >> tmp;
		pq.push(tmp);
	}


	while (pq.size()) {
		auto cur = pq.top(); pq.pop();
		if (pq.empty()) break;

		auto nxt = pq.top(); pq.pop();
		//cout << cur << " " << nxt << " \n";
		pq.push(cur + nxt);
		ret+= (cur + nxt);
	}

	cout << ret;
	return 0;
}

 

3. 코드개선

while(pq.size())를

while(pq.size()>1)로 수정하면 if문이 없어도 된다.