문제
백준 1781번 - 컵라면
아이디어
- 백준 2109번 - 순회강연 문제와 거의 같은 문제다.
- 동일한 데드라인끼리는 최대한 많은 컵라면을 받아야 한다.
- 데드라인 오름차순, 컵라면 개수 내림차순으로 정렬한다.
- 적은 데드라인부터 우선순위큐에 컵라면을 넣는다.
- 그러다가 우선순위큐의 사이즈가 데드라인을 넘어서면 가장 적게 받는 컵라면을 제외시켜준다.
- 우선순위큐의 사이즈가 데드라인의 마지노선이 되는 것이다.
- 마지막에 남아있는 원소들의 합이 정답이다.
예상 시간 복잡도
코드 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BJ_1781 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[i][0] = a;
arr[i][1] = b;
}
Arrays.sort(arr, (o1, o2) -> {
if (o1[0] == o2[0]) {
return o2[1] - o1[1];
}
return o1[0] - o2[0];
});
PriorityQueue<Integer> qu = new PriorityQueue<>();
for (int[] a : arr) {
int deadline = a[0];
int score = a[1];
qu.offer(score);
if (qu.size() > deadline) {
qu.poll();
}
}
int sum = 0;
while (!qu.isEmpty()) {
sum += qu.poll();
}
System.out.println(sum);
}
}