N의 범위가 1 - 100,000 이고, 카드의 최대 값은 1,000이지만 카드를 합쳐가는 과정에서 모든 카드의 수를 계산한다면 int 의 범위를 넘을 수 있기 때문에 Long 을 사용해주겠다.
# Process
main
: 입력받은 값들을 큐에 넣어주고 가장 작은 2장의 카드를 뽑아 더한 후에 다시 큐에 넣어준다.
이 과정을 거치며 2장의 카드의 합을 더해주되, 2개를 뽑아야 하기 때문에 큐에 2개 이상의 카드 값이 들어간 경우에만
순회하는 과정을 거치면 된다.
long sum = 0;
//우선순위 큐에 2개이상 들어있어야 비교가 가능하다.
while (pq.size() > 1) {
long temp1 = pq.poll();
long temp2 = pq.poll();
sum += temp1 + temp2;
pq.add(temp1 + temp2); //합한 묶음 다시 넣기
}
System.out.println(sum);
전체 코드
: 큐를 Long 으로 선언해주고, 입력받는 값도 모두 Long 으로 처리해줬다.
전체 코드는 아래와 같다.
static int N;
static PriorityQueue<Long> pq = new PriorityQueue<Long>();
static void input()
{
N = scan.nextInt();
for(int i=1; i<=N; i++) pq.add(scan.nextLong());
}
static void pro()
{
long sum = 0;
//우선순위 큐에 2개이상 들어있어야 비교가 가능하다.
while (pq.size() > 1) {
long temp1 = pq.poll();
long temp2 = pq.poll();
sum += temp1 + temp2;
pq.add(temp1 + temp2); //합한 묶음 다시 넣기
}
System.out.println(sum);
}
급하게 조사하고 정리하다보니 부족하거나 틀린 내용이 있을 수도 있는데 댓글로 달아주시면 감사하겠습니다!