[백준] 1715번(Java)

나무나무·2025년 1월 6일

백준_코테

목록 보기
13/35

📖 카드 정렬하기

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

매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면 10장과 20장을 합친 뒤, 합친 30장 묶음과 40장을 합친다면 (10 + 20) + (30 + 40) = 100번의 비교가 필요하다. 그러나 10장과 40장을 합친 뒤, 합친 50장 묶음과 20장을 합친다면 (10 + 40) + (50 + 20) = 120 번의 비교가 필요하므로 덜 효율적인 방법이다.

N개의 숫자 카드 묶음의 각각의 크기가 주어질 때, 최소한 몇 번의 비교가 필요한지를 구하는 프로그램을 작성하시오.


💡풀이

  • 처음에 문제에 대한 이해를 하지 못해 sort 하고 계속 더하는 방식만 사용했다.
  • 해당 문제는 초기에 제일 작은 카드 뭉치 두 개를 꺼낸 뒤 그 합을 다시 우선순위 큐에 넣어야 했다.
  • 누적 값을 단순히 넣기만 하면 된다고 생각했으나 지금까지의 카드 뭉치 합만을 우선순위 큐에 넣어야 함을 주의해서 풀어야 했다.
  • ex) 10, 30, 35, 70, 100 씩 총 5개의 카드 뭉치가 있다고 가정하자.
    -> 제일 먼저 10, 30장씩 있는 카드 뭉치를 골라서 둘을 합친 값을 res에 더한다.
    -> 위의 경우 누적 카드 개수는 40장이기 때문에 이 값을 그대로 우선순위 큐에 넣어준다. [35, 40, 70, 100]
    -> 우선순위 큐 가장 앞의 2개의 뭉치를 골라서 둘을 합한 값을 res에 더한다.
    -> 35랑 40을 합한 값은 10, 30, 35 카드 뭉치들의 누적 카드 개수에 해당된다. 이 값을 그대로 다시 우선순위 큐에 넣어주게 된다. [70, 75, 100]
    -> 앞의 제일 작은 값 두 개를 골라서 합한 값을 우선순위 큐에 넣어주고, res에도 합쳐준다. [100, 145]
    -> 최종적인 값은 남은 두 뭉치를 더한 값을 res에 더한 값이 된다.

package heap;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.Queue;

public class bj1715 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        Queue<Integer> ans = new PriorityQueue<Integer>();

        for(int i = 0 ; i < N ; i++){
            ans.add(Integer.parseInt(br.readLine()));
        }
        int res = 0;
        int cur = ans.peek();

        while(ans.size() >= 2){
            int t1 = ans.remove();
            int t2 = ans.remove();

            res += (t1 + t2);
            cur = t1 + t2;
            ans.add(cur);
        }
        System.out.println(res);
    }
}


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

profile
백엔드 개발자 나무입니다

0개의 댓글