Algorithm

[BAEKJOON] 2109번 : 순회강연 (JAVA)

멍목 2023. 8. 19. 20:12
반응형

- 알고리즘 분류 : 구현, 그리디

- 사용 언어 : JAVA

- 문제 요점

    - 우선순위 큐 이용

    - 우선순위 정렬 기준 : 급여 내림차순, 날짜 내림차순

 

소스 설명은 주석을 참고해주세요.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static class Task implements Comparable<Task> {
        int pay;
        int date;

        public Task(int pay, int date) {
            this.pay = pay;
            this.date = date;
        }

        @Override
        public int compareTo(Task o) {
            if(this.pay != o.pay){
                return o.pay - this.pay;
            }
            else{
                return o.date - this.date;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        PriorityQueue<Task> pq = new PriorityQueue<>();

        int maxDate = 0;
        // 급여 > 남은일자
        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            int pay = Integer.parseInt(st.nextToken());
            int date = Integer.parseInt(st.nextToken());

            maxDate = Math.max(maxDate, date);
            pq.offer(new Task(pay, date));
        }

        boolean[] dateArr = new boolean[maxDate+1];

        int totalPay = 0;
        while(!pq.isEmpty()){
            Task task = pq.poll();
            int pay = task.pay;
            int date = task.date;

            for(int i=date; i>0; i--) {
                if (!dateArr[i]) {
                    dateArr[i] = true;
                    totalPay += pay;
                    break;
                }
            }
        }

        System.out.println(totalPay);
    }
}
반응형