728x90

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

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net

 

 

풀이)

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

public class Main_BJ_15903_카드합체놀이 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        PriorityQueue<Long> pq = new PriorityQueue<>();
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++)
            pq.offer(Long.parseLong(st.nextToken()));

        int cnt = 0;
        while(cnt < m){
            long a = pq.poll();
            long b = pq.poll();
            pq.offer(a+b);
            pq.offer(a+b);

            cnt++;
        }

        long sum = 0;
        int size = pq.size();
        for(int i=0; i<size; i++)
            sum += pq.poll();
        System.out.println(sum);

    }//main
}

해당 문제는 그리디로 푸는 문제로, priority queue를 사용하면 쉽게 풀 수 있다!

카드에서 작은 순서대로 정렬을 한 후, 앞에서 2개를 뽑아 더한 수를 다시 pq에 넣어두면, 다시 정렬이 된다.

이 과정을 m번 반복하면 끝!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 2217 로프(JAVA)  (0) 2023.04.02
백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
백준 1966 프린터 큐(JAVA)  (0) 2023.03.28

+ Recent posts