본문으로 바로가기

[백준 1715] 카드 정렬하기

category PS/백준 문제풀이 2019. 8. 29. 12:57
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

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

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면

www.acmicpc.net

 

가장 작은 수가 queue의 top으로 오게하는 priority queue를 이용하면 된다.

99프로에서 계속해서 틀려서 찾아보니 n==1 인 경우는 답이 0이란다...ㅜㅜ

바보같이 들어오는 수라고 생각했다 ㅎ

 

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

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    
    priority_queue<int, vector<int>, greater<int>> pq;
    
    for(int i = 0; i < n; i++){
        int temp;
        cin >> temp;
        pq.push(temp);
    }
    
    int sum = 0;
    if(pq.size() == 1){
        cout << 0 << '\n';
        return 0;
    }
    
    while(!pq.empty()){
        int a = pq.top();   pq.pop();
        int b = pq.top();   pq.pop();
        sum += (a+b);
        if(pq.empty()){
            break;
        }
        pq.push(a+b);
    }
    
    cout << sum << '\n';
    return 0;
}