[적용한 알고리즘]

그리디, 우선순위 큐

 

[아이디어]

제일 작은 거 2개만 필요하니까 우선 순위 큐를 이용하자

 

[생각의 흐름 / 절차] 

1. n개의 입력을 우선순위 큐(pq)에 담는다.

2. 매번 2개씩 뽑아 그 두 개를 더한 값은 다시 pq에 넣는다.

3. pq의 사이즈가 1이라면 그때 멈추고 출력한다.

 

[교훈]

사이즈가 1인걸 판별하는 if문의 위치를 잘못잡아 계속 틀린 답이 나왔다.

애초에 사이즈가 1인 경우를 고려 안했기 때문이다.

그래서 범위의 경계값에 좀 더 주의하도록 하자.

 

<코드>

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

int main(){
    int n;
    priority_queue<int, vector<int>, greater<int>> pq;
    scanf("%d", &n);

    for (int i = 0; i < n; i++){
        int x; scanf("%d", &x);
        pq.push(x);
    }

    int ans = 0;

    while (true){
        if (pq.size() == 1){
            printf("%d\n", ans);
            return 0;
        }
        
        int a = pq.top(); pq.pop();
        int b = pq.top(); pq.pop();
        pq.push(a + b);
        ans += (a + b);
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 2206번 벽 부수고 이동하기  (0) 2019.11.20
[백준] 12886번 돌 그룹  (0) 2019.11.20
[백준] 2075번 N번째 큰 수  (0) 2019.11.20
[백준] 16948번 데스 나이트  (0) 2019.11.18
[백준] 16928번 뱀과 사다리 게임  (0) 2019.11.18

+ Recent posts