n개의 수를 우선순위 큐에 삽입한다. 가장 작은 수 두개를 꺼내서 더하고, 우선순위 큐에 값이 남아있다면, 더한 수를 다시 우선순위 큐에 삽입한다.
c++ (런타임 에러 - Segfault)
int main() {
priority_queue<int> pq;
int n, sum=0;
cin >> n;
while(n--) {
int num;
cin >> num;
pq.push(-num);
}
// 에러 이유
// 입력 값이 하나만 들어왔을 때
// pq.size()가 1인 상태에서 코드가 실행되어서 에러가 난다.
while(1) {
int tmp = 0;
// sum과 tmp에 가장 작은 수 두 개를 더하고
// 그 수를 제거한다
for (int i=0; i<2; i++) {
sum += -pq.top();
tmp += -pq.top();
pq.pop();
}
// 만약 우선순위 큐의 길이가 0이면 반복문을 나온다
// 아니라면 위에서 두 수를 더한 값을 우선순위 큐에 넣어준다
if (pq.size() == 0) {
break;
} else {
pq.push(-tmp);
}
}
cout << sum;
}
c++
int main() {
priority_queue<int> pq;
int n, sum=0;
cin >> n;
while(n--) {
int num;
cin >> num;
pq.push(-num);
}
// 우선순위 큐의 길이가 1보다 크면
while(pq.size() > 1) {
// 가장 작은 수 두 개를 n1, n2에 저장하고, 우선순위 큐에서 제거한다
int n1 = -pq.top();
pq.pop();
int n2 = -pq.top();
pq.pop();
// sum에 두 수를 더해준다
sum += n1 + n2;
// 우선순위 큐에 두 수를 더한 값을 추가한다
pq.push(-(n1 + n2));
}
cout << sum;
}