문제
https://www.acmicpc.net/problem/1781
풀이(17분)
import java.util.*;
import java.io.*;
class Main {
static class Problem implements Comparable<Problem> {
int deadline;
int cup;
Problem(int deadline, int cup) {
this.deadline = deadline;
this.cup = cup;
}
@Override
public int compareTo(Problem o) {
return this.deadline - o.deadline; // 데드라인 오름차순 정렬
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
List<Problem> problems = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int deadline = Integer.parseInt(st.nextToken());
int cup = Integer.parseInt(st.nextToken());
problems.add(new Problem(deadline, cup));
}
Collections.sort(problems); // 데드라인 기준 정렬
// 최소 힙: 지금까지 선택한 문제들 중 최소 컵라면을 유지
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (Problem p : problems) {
pq.offer(p.cup);
// 문제를 풀 수 있는 날 수보다 많아지면, 최소 컵라면 제거
if (pq.size() > p.deadline) {
pq.poll();
}
}
int total = 0;
while (!pq.isEmpty()) {
total += pq.poll();
}
System.out.println(total);
}
}
문제 풀이 전략
리스트를 사용해 유지를 하려고 했지만 생각보다 복잡해져 우선순위 큐를 도입하여 해결했다.
커스텀 정렬을 할 줄 안다면 그렇게 어려운 문제는 아니라고 느껴졌다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 17413번. 단어 뒤집기 2(JAVA) (0) | 2025.08.06 |
---|---|
[백준] 10434번. 행복한 소수(JAVA) (3) | 2025.08.03 |
[백준] 1822번. 차집합(JAVA) (1) | 2025.08.02 |
[백준] 15779번. Zigzag(JAVA) (0) | 2025.07.01 |
[백준] 1967번. 트리의 지름(JAVA) (1) | 2025.07.01 |