백준 1781번 - 컵라면

장근영·2024년 8월 19일
0

BOJ - 그리디

목록 보기
18/35

문제

백준 1781번 - 컵라면


아이디어

  • 백준 2109번 - 순회강연 문제와 거의 같은 문제다.
  • 동일한 데드라인끼리는 최대한 많은 컵라면을 받아야 한다.
  • 데드라인 오름차순, 컵라면 개수 내림차순으로 정렬한다.
  • 적은 데드라인부터 우선순위큐에 컵라면을 넣는다.
  • 그러다가 우선순위큐의 사이즈가 데드라인을 넘어서면 가장 적게 받는 컵라면을 제외시켜준다.
  • 우선순위큐의 사이즈가 데드라인의 마지노선이 되는 것이다.
  • 마지막에 남아있는 원소들의 합이 정답이다.

예상 시간 복잡도

  • 예상 시간 복잡도 : O(N log N)

코드 구현

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);
    }
}

profile
오늘 할 일을 내일로 미루지 말자.

0개의 댓글