image

백준 2109: 순회강연

Link: https://www.acmicpc.net/problem/2109

풀이

  • 각 강연은 우선순위가 존재(더 비싼 강연을 우선적으로)
  • 강의들은 기간 제한이 존재 ( d일까지 와서 강연을 해주면 p원을 준다.)
  • 제한 기간 내에 할 수 있는 강의들 중 가장 비싼 강연을 골라서 해야 함!
  • 우선순위 큐를 이용.
  • 강연을 날짜별로 입력받고 늦은 날부터 탐색
  • 해당 일에 할 수 있는 강연을 모두 pq에 넣음.(비싼 강연이 우선)
  • 날짜를 줄여가며 pq에 강연이 남아있다면 sum추가
package algorithm2023.oct.day12;

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

public class BOJ_2109_순회강연 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static StringBuilder sb = new StringBuilder();
	static PriorityQueue<Integer> pq = new PriorityQueue<>((o1,o2)->o2-o1);
	static ArrayList<ArrayList<Integer>> lec = new ArrayList<>();
	static int n;


	public static void main(String[] args) throws Exception {
		n = Integer.parseInt(br.readLine());
		
		for(int i =0 ;i<=10000;i++) {
			lec.add(new ArrayList<>());
		}

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			int p = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());

			lec.get(d).add(p);
			
		}
		int sum = 0;
		
		for(int i= 10000;i>0;i--) {
			for(int n : lec.get(i)) {
				pq.add(n);
			}
			if(!pq.isEmpty()) {
				sum+=pq.poll();
			}
		}
		
		System.out.println(sum);

	}
}

Issue

  • 없음.

Leave a comment