문제 설명
한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다. 각 대학에서 제시하는 d와 p값은 서로 다를 수도 있다. 이 학자는 이를 바탕으로, 가장 많은 돈을 벌 수 있도록 순회강연을 하려 한다. 강연의 특성상, 이 학자는 하루에 최대 한 곳에서만 강연을 할 수 있다.
예를 들어 네 대학에서 제시한 p값이 각각 50, 10, 20, 30이고, d값이 차례로 2, 1, 2, 1 이라고 하자. 이럴 때에는 첫째 날에 4번 대학에서 강연을 하고, 둘째 날에 1번 대학에서 강연을 하면 80만큼의 돈을 벌 수 있다.
문제 풀이
이 문제에 접근할 때 배낭탐색처럼 p/d로 비율을 따져 접근하려 했지만 단순히 p, d의 순서대로 정렬하여 접근하면 되는 문제였습니다. 아래의 케이스를 정리하면 표처럼 정리됩니다.
해당 날짜~1까지 탐색하여 빈 곳이 있을 경우 배열에 체크해주면 해결하실 수 있습니다.
7
20 1
2 1
10 3
100 2
8 2
5 20
50 10
강연료 | 일자 |
100 | 2 |
50 | 10 |
20 | 1 |
10 | 3 |
8 | 2 |
5 | 20 |
2 | 1 |
<풀이과정>
1. (p:100, d:2)
1 | 2 | 3 | 10 | 20 |
100 |
2. (p:50, d:10)
1 | 2 | 3 | 10 | 20 |
100 | 50 |
3. (p:20, d:1)
1 | 2 | 3 | 10 | 20 |
20 | 100 | 50 |
4. (p:10, d:3)
1 | 2 | 3 | 10 | 20 |
20 | 100 | 10 | 50 |
5. (p:8, d:2) <- 2~1까지 꽉 차있으므로 X
1 | 2 | 3 | 10 | 20 |
20 | 100 | 10 | 50 |
6. (p:5, d:20)
1 | 2 | 3 | 10 | 20 |
20 | 100 | 10 | 50 | 5 |
7. (p:2, d:1) <- 2~1까지 꽉 차있으므로 X
1 | 2 | 3 | 10 | 20 |
20 | 100 | 10 | 50 | 5 |
풀이 코드
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
static int N;
static Queue<int[]> queue = new PriorityQueue<>((n1, n2) -> (n1[0] == n2[0] ? n2[1]-n1[1] : n2[0] - n1[0]));
static boolean[] check = new boolean[10001];
private static void input() throws IOException {
N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
int p = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
queue.add(new int[]{p, d});
}
}
private static void process() throws IOException{
int ans = 0;
while(!queue.isEmpty()){
int[] lecture = queue.poll();
for(int j=lecture[1]; j>=1; j--){
if(!check[j]){
check[j] = true;
ans += lecture[0];
break;
}
}
}
System.out.println(ans);
}
public static void main(String[] args) throws IOException {
input();
process();
}
}
<출처>
https://www.acmicpc.net/problem/2109
반응형
'백준' 카테고리의 다른 글
[BOJ][Java] 백준 2457번: 공주님의 정원 (0) | 2022.03.07 |
---|---|
[BOJ][Java] 백준 2012번: 등수 매기기 (0) | 2022.03.07 |
[BOJ][Java] 백준 2138번: 전구와 스위치 (0) | 2022.03.06 |
[BOJ][Java] 백준 1976번: 여행 가자 (0) | 2022.03.04 |
[BOJ][Java] 백준 1080번: 행렬 (0) | 2022.03.04 |
댓글