컴굥일지

[BOJ/백준 1715][C++] 카드 정렬하기 본문

알고리즘/코테 문제

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

gyong 2023. 8. 20. 15:19
반응형

문제

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

백준 1715

 

문제 내용

정렬된 두 묶음의 숫자카드가 있다. 각 묶음의 카드의 수가 A, B개일 대, 두 묶음을 하나로 합칠 때 A+B번의 비교가 필요하다.

N개의 카드 묶음을 받아, 이들을 두 묶음씩 골라 서로 합쳐나가려고 한다. 

최소 몇 번의 비교가 필요한지 구하면 된다.

 

문제 풀이

문제에 나와있는 대로, 매번 가장 묶음이 작은 것을 2개 골라 합치면 된다.

priority_queue를 통해 이 문제를 해결할 수 있다. (최소힙 사용)

 

코드

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

int main() {
    int n, tmp;
    priority_queue<int, vector<int>, greater<int>> pq;

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

    int compare = 0;
    while (pq.size() > 1) {
        int p1 = pq.top();
        pq.pop();
        int p2 = pq.top();
        pq.pop();

        compare += (p1 + p2);
        pq.push(p1 + p2);
    }

    cout << compare;
}

 

반응형
Comments