알고리즘

백준 1202번 보석 도둑 (JAVA)

박카스마시며코딩 2023. 11. 15. 16:06

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

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

 

저는 우선순위 큐를 통해 문제를 해결하였습니다.

먼저 보석과 가방을 무게가 낮은 순서대로 정렬하고, 가방의 무게보다 보석들의 가치를 우선순위 큐에 넣어서 해당 가방보다 낮은 무게 중 가장 큰 가치를 갖고 있는 것을 빼네어 문제를 해결하였습니다.

 

 

package BOJ.greedy;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class BOJ_1202_2 {
    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 k = Integer.parseInt(st.nextToken());
        List<int[]> jewelry = new ArrayList<>();
        for(int i = 0 ; i < n ; i++){
            st = new StringTokenizer(br.readLine());
            int m =  Integer.parseInt(st.nextToken());
            int v =  Integer.parseInt(st.nextToken());
            jewelry.add(new int[]{m,v});
        }
        int[] bag = new int[k];
        for(int i = 0 ; i < k ; i++){
            bag[i] = Integer.parseInt(br.readLine());
        }
        long result = cal(bag,jewelry,n,k);
        System.out.println(result);
    }

    private static long cal(int[] bag, List<int[]> jewelry, int n, int k) {
        jewelry.sort((v1,v2)->{
            return v1[0] - v2[0];
        });
        Arrays.sort(bag);
        int index = 0;
        long sum = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        for(int i = 0 ; i < k ; i++){
            while(index < n && jewelry.get(index)[0] <= bag[i]){
                pq.offer(jewelry.get(index)[1]);
                index++;
            }
            if(!pq.isEmpty()){
                sum += pq.poll();
            }
        }
        return sum;
    }

}