BOJ 15903 카드 합체 놀이

LONGNEW·2021년 5월 9일
0

BOJ

목록 보기
224/333

https://www.acmicpc.net/problem/15903
시간 1초, 메모리 512MB
input :

  • 카드의 개수 n(2 ≤ n ≤ 1,000)
  • 카드 합체를 몇 번 하는지 m(0 ≤ m ≤ 15×n)

output :

  • 만들 수 있는 가장 작은 점수를 출력

조건 :

  • 카드 합체
  • x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)
  • 계산한 값을 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.

현재 배열에 존재하는 수 중 가장 작은 두 수를 골라 합하게 하면 모든 수의 합을 구했을 때 가장 작은 값을 구할 수 있다.

우선순위 큐를 사용해서 가장 앞의 두 값을 취한 후 더한 값을 2개 넣어주는 식으로 수행,
그리고 마지막에 모든 값을 더하게 하자.

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

public class BOJ_15903_duplicate {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PriorityQueue<Long> data = new PriorityQueue<>();

    public static void main(String[] args) throws IOException {
        String[] temp = br.readLine().split(" ");
        int m = Integer.parseInt(temp[1]);
        temp = br.readLine().split(" ");
        for (String item : temp)
            data.add(Long.parseLong(item));

        for (int i = 0; i < m; i++){
            long a = data.poll();
            long b = data.poll();

            data.add(a + b);
            data.add(a + b);
        }

        long ans = 0;
        for (Long n : data)
            ans += n;

        System.out.println(ans);
    }
}

그리고, 카드에 들어있는 숫자의 범위가 1백만인데 이 숫자가 1000개 있다면 int 범위를 넘어가니, long 자료형을 사용하자.

0개의 댓글