본문 바로가기

algorithm/Greedy

[C++] BOJ 1715 카드 정렬하기

문제

백준 1715번 카드 정렬하기 https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

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

www.acmicpc.net

코드

#include<iostream>
#include<queue>
#include<functional>
using namespace std;
int n, ans = 0;

int main() {
	priority_queue<int, vector<int>, greater<int>> pq;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;
		pq.push(num);
	}
	while (pq.size()>1) {
		int tmp = pq.top(); pq.pop();
		tmp += pq.top(); pq.pop();
		ans += tmp;
		pq.push(tmp);
	}
	cout << ans;
}

풀이방법

처음에 비교하는 카드는 최대 n-1번, 마지막에 비교하는 카드는 최소 1번 비교횟수에 더해진다. 이를 이용해서 구성 카드 수가 가장 작은 묶음을 가장 많이 더해주면 최소 비교횟수를 알 수 있다. 이를 구현하기 위해서 우선순위 큐에 각 묶음의 카드 수를 넣어서 크기가 작은 순서로 나오도록 설정하고, 한번 더할때마다 1쌍씩 pop해준 뒤 둘의 합을 결과값에 더하고 다시 push해준다. 이를 모든 묶음이 더해질 때까지, 즉 마지막에 push한 수 하나만 남을 때까지 반복한다. 

고민과정

우선순위큐를 원하는 방향대로 만드는 것이 아직 익숙하지 않아서 우선순위큐를 만드는 것 자체는 구글링을 통해 해결했다.

'algorithm > Greedy' 카테고리의 다른 글

[C++] BOJ 15889 호 안에 수류탄이야!!  (0) 2022.01.12
[C++] BOJ 11047 동전 0  (0) 2021.03.27
[C++] BOJ 12782 비트 우정지수  (0) 2021.03.27
[C++] BOJ 11256 사탕  (0) 2021.03.26
Greedy (탐욕) 알고리즘  (0) 2021.03.26