이 문제의 핵심은 묶음의 크기가 작은 카드부터 합치는 것이다.
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PriorityQueue<Integer> queue = new PriorityQueue<>();
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
int data = sc.nextInt();
queue.add(data);
}
int data1 = 0;
int data2 = 0;
int sum = 0;
while (queue.size() != 1) {
data1 = queue.remove();
data2 = queue.remove();
sum += data1 + data2;
queue.add(data1 + data2);
}
System.out.println(sum);
}
}
이 문제는 먼저 선택된 카드 묶음이 더 많은 영향을 미치는 것을 알아차리는 것이 포인트이다. 크기가 가장 작은 카드 묶음 2개를 뽑고 이 2개를 기준으로 합친 새로운 카드 묶음을 다시 데이터에 넣고 정렬해야된다. 즉, 데이터의 삽입, 삭제, 정렬이 자주일어난다는 뜻이다. 따라서 우선순위 큐를 사용해야한다.