728x90
그리디 알고리즘 섹션 - (2)
🟪 PriorityQueue 우선순위 큐
- 일반적으로 스택은 LIFO 후입선출 구조를 갖고, 큐는 FIFO 선입선출 구조를 갖는다.
- 그 중에서도 우선순위 큐의 경우, 들어온 순서와는 상관없이 우선순위가 높은 요소를 먼저 처리하는 자료구조이다.
🟪 ‘자바’의 우선순위 큐 라이브러리 사용법
- 기본적으로 PriorityQueue를 생성하면 우선순위 낮은 순으로 객체가 생성되는데 , 그 역순으로 (우선순위 높은 순) 으로 생성하려면 생성 인자로 Collections.reverseOrder() 를 주면 된다.
import java.util.PriorityQueue; //import
//int형 priorityQueue 선언 (우선순위가 낮은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
//int형 priorityQueue 선언 (우선순위가 높은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
//String형 priorityQueue 선언 (우선순위가 낮은 숫자 순)
PriorityQueue<String> priorityQueue = new PriorityQueue<>();
//String형 priorityQueue 선언 (우선순위가 높은 숫자 순)
PriorityQueue<String> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
- Priority Queue 값 추가 | add() , offer()
- Priority Queue 값 삭제 | clear() , remove()
- Priority Queue 값 꺼내기 | poll()
- Priority Queue 에서 우선순위 가장 높은 값 출력 | peek()
9-4. 최대 수입 스케줄 (PriorityQueue 응용 문제)
설명
현수는 유명한 강연자이다. N개이 기업에서 강연 요청을 해왔다. 각 기업은 D일 안에 와서 강연을 해 주면 M만큼의 강연료를 주기로 했다.
각 기업이 요청한 D와 M를 바탕으로 가장 많을 돈을 벌 수 있도록 강연 스케쥴을 짜야 한다.
단 강연의 특성상 현수는 하루에 하나의 기업에서만 강연을 할 수 있다.
입력
첫 번째 줄에 자연수 N(1<=N<=10,000)이 주어지고, 다음 N개의 줄에 M(1<=M<=10,000)과 D(1<=D<=10,000)가 차례로 주어진다.
출력
첫 번째 줄에 최대로 벌 수 있는 수입을 출력한다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.Scanner;
/* 9-4. 최대 수입 스케줄 (PriorityQueue) */
class Lecture implements Comparable<Lecture>{
public int money;
public int time;
Lecture(int money, int time){
this.money = money;
this.time = time;
}
@Override
public int compareTo(Lecture o) {
return o.time - this.time; //시간 기준 내림차순 정렬
};
}
public class Main1 {
static int n, max = Integer.MIN_VALUE;
//솔루션
public int solution(ArrayList<Lecture> arr) {
int answer = 0;
//생성 시 COllections.reverseOrder() 하면 우선순위 높은 순으로 객체 저장된다.
PriorityQueue<Integer> pQ = new PriorityQueue<>(Collections.reverseOrder());
//객체 정렬
Collections.sort(arr);
int j = 0;
//역순으로 돌기
for(int i = max; i>=1; i--) {
for(; j<n; j++) {
if(arr.get(j).time < i) break;
pQ.offer(arr.get(j).money);
}
if(!pQ.isEmpty()) answer += pQ.poll();
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main1 T = new Main1();
Scanner kb= new Scanner(System.in);
n = kb.nextInt();
ArrayList<Lecture> arr = new ArrayList<>();
for(int i =0; i<n; i++) {
int m = kb.nextInt();
int d = kb.nextInt();
arr.add(new Lecture(m, d));
if(d>max) max = d; //일단 최대 날짜값을 담아주고
}
System.out.println(T.solution(arr));
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 1' 카테고리의 다른 글
동적 계획 알고리즘 -(1) (0) | 2023.04.03 |
---|---|
트리 관련 개념 정리 (0) | 2023.04.03 |
그리디 알고리즘 섹션 - (1) (0) | 2023.03.30 |
DFS, BFS 활용 섹션 -(5) | 복습 (0) | 2023.03.29 |
DFS, BFS 활용 섹션 -(4) (0) | 2023.03.28 |