새소식

Algorithm/BOJ

(JAVA) [BOJ]백준 1715번, 카드 정렬하기

  • -
728x90

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

1715, 카드 정렬하기

이번 문제는 우선순위 큐를 사용해서 풀어보겠다.

 

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);
}

 

 

 

 

급하게 조사하고 정리하다보니 부족하거나 틀린 내용이 있을 수도 있는데 댓글로 달아주시면 감사하겠습니다!

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.