문제
BOJ 1202 보석 도둑
접근방법
- 욕심쟁이 알고리즘이다
- 조건에 만족하는 것 중에 가장 큰 것을 고르는 방법으로 하면 최적의 답이 나온다.
- 알고리즘 자체가 어렵지는 않은데 정렬에 대해 명확히 알고 있어야 할 것 같다.
구현
import java.io.*;
import java.util.*;
class Main {
static int N;
static int K;
static List<Jewel> jewels = new ArrayList<>();
static List<Integer> bags = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ", false);
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ", false);
jewels.add(new Jewel(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
}
for (int i = 0; i < K; i++) {
bags.add(Integer.parseInt(br.readLine()));
}
Collections.sort(bags);
Collections.sort(jewels, Comparator.comparing(Jewel::getM));
PriorityQueue<Jewel> pq = new PriorityQueue<>(Comparator.comparing(Jewel::getV).reversed());
int jIndex = 0;
long result = 0;
for (int i = 0; i<bags.size(); i++) {
int bag = bags.get(i);
while (jIndex < N && jewels.get(jIndex).M <= bag) {
pq.add(jewels.get(jIndex++));
}
if (!pq.isEmpty()) {
result += pq.poll().V;
}
}
bw.write(result + "");
bw.close();
}
}
class Jewel {
int M;
int V;
public Jewel(int M, int V) {
this.M = M;
this.V = V;
}
public int getM() {
return M;
}
public int getV() {
return V;
}
}
제출