[백준] 1202: 보석 도둑 - JAVA

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

풀이

가방의 용량이 정해져있고, 가방에는 보석을 한개씩 넣을 수 있다.

즉, 가방을 오름차순으로 보면서 넣을 수 있는 보석 중 가치가 가장 큰것을 넣으면서 진행한다.

가방을 오름차순으로 정렬하고

가방의 사이즈보다 보석의 무게가 작다면 우선순위큐에 넣고

우선순위큐에서 위의 것을 빼면 되도록 구현했다.


메모리: 115988KB

시간: 1888ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    static class Node {
        int m;
        int v;

        public Node(int m, int v) {
            this.m = m;
            this.v = v;
        }

    }

    public static void main(String[] args) throws IOException {
        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());

        Node[] gem = new Node[N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int m = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            gem[i] = new Node(m, v);
        }

        Arrays.sort(gem, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                if (o1.m == o2.m) {
                    return Integer.compare(o2.v, o1.v);
                } else {
                    return Integer.compare(o1.m, o2.m);
                }
            }

        });

        int[] bag = new int[M];
        for (int i = 0; i < M; i++) {
            bag[i] = Integer.parseInt(br.readLine());
        }
        Arrays.sort(bag);

        long ans = 0;
        int idx = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
        for (int i = 0; i < M; i++) {
            int size = bag[i];
            while (idx < N && gem[idx].m <= size) {
                pq.add(gem[idx++].v);
            }

            if (!pq.isEmpty()) {
                ans += pq.poll();
            }
        }

        System.out.println(ans);
    }

}