정리
백준 2109번: 순회강연 본문
백준 2109번: 순회강연
2109번: 순회강연
문제 한 저명한 학자에게 n(0≤n≤10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1≤d≤10,000)일 안에 와서 강연을 해 주면 p(1≤p≤10,000)만큼의 강연료를 지불하겠다고 알려왔다. 각 대학에서 제시하는 d와 p값은 서로 다를 수도 있다. 이 학자는 이를 바탕으로, 가장 많은 돈을 벌 수 있도록 순회강연을 하려 한다. 강연의 특성상, 이 학자는 하루에 최대 한 곳에서만 강연을 할 수 있다.
www.acmicpc.net

- 정렬과 그리디 알고리즘을 활용하는 문제이다.
- 2차원 배열, 정렬, 우선순위 큐를 통해 아래로 같은 방법 같이 문제를 해결할 수 있다.
- 먼저 a[N][2], 2차열 배열을 만든 후에 입력을 받는다.
- a배열을 2번째 element가 오름차순이 되도록 정렬한다.
- 정렬을 마치면 위의 그림과 같이 될 것이다.
- PriorityQueue에 a[i][0]의 값을 계속해서 add() 해 준다. 만약 a[i][1]의 값이 PriorityQueue의 크기보다 작으면 PriorityQueue의 크기가 a[i][1]와 같아질 때까지 remove()을 통해 제일 작은 값들을 삭제한다.
- PriorityQueue에 있는 모든 값들을 더하면 답이 된다.
- 예제로
4 // N
5 3
1 2
4 3
4 1
의 데이터를 보자.
- 이 데이터에서는 1, 3, 4번째 강의를 가야지 돈을 최대로 벌 수 있다.
- 위 데이터를 정렬하면 아래와 같이 될 것이다.

- 순서대로 a[i][0]의 값들을 우선순위 큐에 add()하면 된다. 그러면 우선순위 큐에는 1, 4, 4, 5 값들이 저장되어 있을 것이다. a[3][1] 의 값은 3이나 우선순위 큐의 크기는 4이므로 가장 작은 1이 remove된다. 따라서 우선순위 큐에는 4, 4, 5 값이 저장되고 이를 모두 더하면 답이 된다.
- 이처럼 a[i][1]의 값보다 우선순위 큐의 크기가 크다면 서로 값이 같아질 때까지 우선순위 큐에 있는 값을 하나씩 remove하면 최종적으로 벌 수 있는 최댓값이 나오게 된다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
import java.io.*; | |
public class boj{ | |
static int n; | |
static int[][] a; | |
static int ans = 0; | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringTokenizer st = new StringTokenizer(br.readLine()); | |
n = Integer.parseInt(st.nextToken()); | |
a = new int[n][2]; | |
for (int i = 0; i < n; i++) { | |
st = new StringTokenizer(br.readLine()); | |
for (int j = 0; j < 2; j++) { | |
a[i][j] = Integer.parseInt(st.nextToken()); | |
} | |
} | |
Arrays.sort(a, Comparator.comparingInt(o1 -> o1[1])); | |
PriorityQueue<Integer> pq = new PriorityQueue<>(); | |
for (int i = 0; i < n; i++) { | |
int day = a[i][1]; | |
pq.add(a[i][0]); | |
while (day < pq.size()) | |
pq.remove(); | |
} | |
while (!pq.isEmpty()) | |
ans += pq.poll(); | |
System.out.println(ans); | |
} | |
} |
- 이 문제와 유사한 문제로는 백준 1781번: 컵라면 문제가 있다. 굉장히 유사한 문제이니 이러한 종류의 문제풀이를 연습하고 있었다면 위 문제도 꼭 풀어보면 좋을 것이라 생각한다.
1781번: 순회공연
상욱 조교는 동호에게 N개의 문제를 주고서, 각각의 문제를 풀었을 때 컵라면을 몇 개 줄 것인지 제시 하였다. 하지만 동호의 찌를듯한 자신감에 소심한 상욱 조교는 각각의 문제에 대해 데드라인을 정하였다.
www.acmicpc.net
'Programming > 백준 BOJ' 카테고리의 다른 글
백준 2493번: 탑 (0) | 2020.10.12 |
---|---|
백준 14488번: 준오는 급식충이야!! (0) | 2020.09.30 |
백준 1461번: 도서관 (0) | 2020.09.28 |
백준 2473번: 세 용액 (0) | 2020.09.21 |
백준 2470번: 두 용액 (0) | 2020.09.08 |
Comments