알고리즘/백준

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

겜도리도리 2021. 11. 22. 22:15
반응형

문제

백준 1715 카드 정렬하기 C++

 

1715번: 카드 정렬하기

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

www.acmicpc.net

풀이

최소로 비교하는 방법은 작은 값부터 합치는 것이다.

방법은 다음과 같다.

1. 오름차순으로 queue를 정리한다.

2. 최소값 두 개를 꺼내고 합친 값을 queue에 다시 푸쉬

3. queue 사이즈가 1이라면 출력

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    // 우선순위 큐(오름차순 정렬)
    priority_queue<intvector<int>, greater<>> pq;
    int N;
    int sum = 0;
    cin >> N;
    // 입력
    for (int i = 0; i < N; i++) {
        int num;
        cin >> num;
        pq.push(num);
    }
    // 두개 꺼내고 다시 넣어줌
    while (1) {
        // 사이즈 1이면 지금까지의 합 출력
        if (pq.size() == 1) {
            cout << sum;
            break;
        }
        int temp1, temp2;
        temp1 = pq.top();
        pq.pop();
        temp2 = pq.top();
        pq.pop();
        int tempsum = temp1 + temp2;
        sum += tempsum;
        pq.push(tempsum);
    }
    return 0;
}
cs

 

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 5052] 전화번호 목록 C++  (0) 2021.11.27
[백준 13913] 숨바꼭질 4 C++  (0) 2021.11.24
[백준 2096] 내려가기 C++  (0) 2021.11.22
[백준 1339] 단어 수학 C++  (0) 2021.11.15
[백준 1405] 미친 로봇 C++  (0) 2021.11.15