알고리즘
백준 1202번 보석 도둑 (JAVA)
박카스마시며코딩
2023. 7. 2. 16:41
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;
import java.util.function.Function;
public class BOJ_1202 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int k = stoi.apply(st.nextToken());
List<int[]> input = new ArrayList<>();
for(int i = 0 ; i < n ; i++){
st = new StringTokenizer(br.readLine());
int m = stoi.apply(st.nextToken());
int v = stoi.apply(st.nextToken());
input.add(new int[]{m,v});
}
int[] bag = new int[k];
for(int i = 0 ; i < k ; i++){
bag[i] = stoi.apply(br.readLine());
}
Collections.sort(input,(v1,v2)->{
return v1[0] - v2[0];
});
Arrays.sort(bag);
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
long sum = 0;
int index = 0;
for(int i = 0 ; i < k ; i++){
while(index < n && input.get(index)[0] <= bag[i]){
pq.offer(input.get(index)[1]);
index++;
}
if(!pq.isEmpty()){
sum += pq.poll();
}
}
System.out.println(sum);
}
}