ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]:1202: 보석 도둑(java)
    Algorithm/백준 2022. 3. 30. 22:09
    728x90

    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

    문제

    세계적인 도둑 상덕이는 보석점을 털기로 결심했다.

    상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.

    상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)

    다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)

    다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)

    모든 숫자는 양의 정수이다.

    출력

    첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.

    예제 입력 1

    2 1
    5 10
    100 100
    11
    

    예제 출력 1

    10

    풀이

    1. 보석과 가방을 무게를 기준으로 오름차순으로 정렬해준다.

    Collectoins.sort 사용한 이유는 더 빨라서 사용했습니다.

    2. 현재 넣으려는 가방(가방중에 가장 가벼운 무게를 넣을 수 있는) 에 넣을 수 있는 보석을 모두 우선순위큐에 담는다.

    - 현재 내 가방의 무게보다 더 작은 무게의 보석이 모두 우선순위 큐에 들어간다.

    3. 우선순위큐는 내림차순으로 무게로 정렬이 되며 하나를 뽑아주면 가장 무거운게 나온다.

    - 현재 내 가방에 가장 큰 보석을 넣는 과정.

    4. 2번 과정을 반복하는데 이미 우선순위큐에 들어가있는것도 누적 돼 확인하게된다.

    전체 코드

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.*;
    
    public class BJ_G2_1202_보석도둑 {
        static class Jewel implements Comparable<Jewel>{
            int m;
            int v;
            Jewel(int m, int v) {
                this.m = m;
                this.v = v;
            }
    
            @Override
            public int compareTo(Jewel o) {
                return this.m-o.m;
            }
        }
    
        static class Num implements Comparable<Num> {
            int n;
            Num(int n) {
                this.n = n;
            }
    
            @Override
            public int compareTo(Num o) {
                return o.n - this.n;
            }
        }
        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());
            ArrayList<Jewel> jewel = 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());
                jewel.add(new Jewel(m, v));
            }
            ArrayList<Integer> bag = new ArrayList<>();
            for(int i=0; i<K; i++) {
                bag.add(Integer.parseInt(br.readLine()));
            }
            Collections.sort(jewel);
            Collections.sort(bag);
    
            long sum = 0;
            int idx = 0;
            PriorityQueue<Num> pq = new PriorityQueue<>();
    
            for(int i=0; i<K; i++) {
                for(int j=idx; j<N; j++) {
                    if(jewel.get(j).m <= bag.get(i)) {
                        idx++;
                        pq.add(new Num(jewel.get(j).v));
                    } else {
                        break;
                    }
                }
                if(pq.isEmpty()) continue;
                sum+=pq.poll().n;
            }
            System.out.println(sum);
        }
    }
    728x90

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

    [백준]15685: 드래곤 커브  (0) 2022.04.01
    [백준]1339: 단어 수학(java)  (0) 2022.03.31
    [백준]:15684: 사다리 조작(java)  (0) 2022.03.28
    [백준]:12869: 뮤탈리스크(java)  (0) 2022.03.27
    [백준]1039: 교환(java)  (0) 2022.03.26

    댓글

Designed by Tistory.