Homework
를 deadline
, num
(컵라면 수) 필드로 만든다.homeworks
) deadline
으로 오름차순 한다.pq
를 초기화한다.homeworks
를 순회하며pq
에 넣고pq
의 크기가 deadline
보다 크면 같아질 때까지 컵라면 개수가 가장 낮은 것을 뺀다.하루에 한 문제만 풀 수 있으므로
pq
의 크기는 지난 날짜와 같다.
현재pq
에 추가한 숙제의deadline
이pq
의 크기보다 작다면 같아질 때까지pq
에 있는 숙제들을 버려야 한다.
버릴 때는 가장 컵라면 수가 적은 숙제를 버려야 하므로,num
으로 오름차순한pq
를 사용한 것이다.
public class Main {
public static void main(String[] args) throws IOException {
// 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
List<Homework> homeworks = new ArrayList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int deadline = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
homeworks.add(new Homework(deadline, num));
}
// 그리디
Collections.sort(homeworks, comparingInt(o -> o.deadline));
PriorityQueue<Homework> pq = new PriorityQueue<>(comparingInt(o -> o.num));
for (Homework homework : homeworks) {
pq.offer(homework);
while (pq.size() > homework.deadline) {
pq.poll();
}
}
int answer = 0;
while (!pq.isEmpty()) {
answer += pq.poll().num;
}
System.out.println(answer);
}
}
class Homework {
public int deadline;
public int num;
public Homework(int deadline, int num) {
this.deadline = deadline;
this.num = num;
}
}