-
[백준]:1202: 보석 도둑(java)Algorithm/백준 2022. 3. 30. 22:09728x90
https://www.acmicpc.net/problem/1202
문제
세계적인 도둑 상덕이는 보석점을 털기로 결심했다.
상덕이가 털 보석점에는 보석이 총 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