문제
코드
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<int> card;
int N, result = 0;
cin >> N;
for (int i = 0; i < N; i++) {
int t;
cin >> t;
card.push(-t);
}
while (card.size() > 1) {
int first = -card.top();
card.pop();
int second = -card.top();
card.pop();
int sum = first + second;
result += sum;
card.push(-sum);
}
cout << result;
}
풀이
1. 처음엔 가장 작은 수 두 개를 먼저 고르고 그 다음엔 가장 작은 수 두 개를 더한 값과 세 번째로 작은 수를 더하는 코드를 구현해야 한다.
2. 따라서 작은 값을 먼저 반환하는 우선순위 큐를 활용하여 코드를 구성한다.
3. 카드가 한 장만 남을 때까지 실행되는 while문 내에서 first에는 가장 작은 수를 넣은 다음 pop, second에는 그 다음으로 작은 수를 넣은 다음 pop하여 두 값을 더하고(sum) 다시 우선순위 큐에 push
4. 결과값이 될 result에 sum을 더한다.
'코테 > 정렬' 카테고리의 다른 글
[java] 프로그래머스스쿨 연습문제 Lv.2 정렬 문제 모음 (0) | 2023.04.28 |
---|---|
[C/C++] 백준 18310, 정렬 (0) | 2023.03.09 |
[C/C++] 프로그래머스스쿨 실패율, 정렬 (0) | 2023.03.08 |
[C/C++] 백준 10825, 정렬 (0) | 2023.03.08 |
[C/C++] 나동빈 두 배열의 원소 교체, 정렬 (0) | 2023.03.01 |