알고리즘

백준 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;
    }

}

'알고리즘' 카테고리의 다른 글

백준 14499번 주사위 굴리기 (JAVA)  (0) 2023.11.17
백준 13335번 트럭 (JAVA)  (0) 2023.11.16
백준 1753번 최단경로 (JAVA)  (1) 2023.11.14
백준 1655번 가운데를 말해요 (JAVA)  (0) 2023.11.13
백준 11399번 ATM (JAVA)  (0) 2023.11.12