[Baekjoon] 1781번 : 컵라면
1. 문제
https://www.acmicpc.net/problem/1781
- 그리디 문제
// 문제
상욱 조교는 동호에게 N개의 문제를 주고서,
각각의 문제를 풀었을 때 컵라면을 몇 개 줄 것인지 제시 하였다.
하지만 동호의 찌를듯한 자신감에 소심한 상욱 조교는
각각의 문제에 대해 데드라인을 정하였다.
문제 번호 1 2 3 4 5 6 7
데드라인 1 1 3 3 2 2 6
컵라면 수 6 7 2 1 4 5 1
위와 같은 상황에서 동호가 2, 6, 3, 1, 7, 5, 4 순으로 숙제를 한다면
2, 6, 3, 7번 문제를 시간 내에 풀어 총 15개의 컵라면을 받을 수 있다.
문제는 동호가 받을 수 있는 최대 컵라면 수를 구하는 것이다.
위의 예에서는 15가 최대이다.
문제를 푸는데는 단위 시간 1이 걸리며,
각 문제의 데드라인은 N이하의 자연수이다.
또, 각 문제를 풀 때 받을 수 있는 컵라면 수와
최대로 받을 수 있는 컵라면 수는 모두 231보다 작거나 같은 자연수이다.
// 입력
첫 줄에 숙제의 개수 N (1 ≤ N ≤ 200,000)이 들어온다.
다음 줄부터 N+1번째 줄까지 i+1번째 줄에
i번째 문제에 대한 데드라인과
풀면 받을 수 있는 컵라면 수가 공백으로 구분되어 입력된다.
// 출력
첫 줄에 동호가 받을 수 있는 최대 컵라면 수를 출력한다.
// 예제 입력 1
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
// 예제 출력 1
15
2. 핵심 아이디어
- 데드라인을 초과하는 문제는 풀 수 없음
- 데이터의 개수는 최대 200,000
- 정렬 및 우선순위 큐를 이용하여 O(NlogN)의 시간에 해결할 수 있음
3. Python 문제풀이
import sys
import heapq
input = sys.stdin.readline
n = int(input())
arr = []
q = []
# 문제 정보를 입력 받은 이후에, 데드라인을 기준으로 정렬
for i in range(n) :
a, b = map(int, input().split())
arr.append((a, b))
arr.sort()
for i in arr :
a = i[0]
heapq.heappush(q, i[1])
# 데드라인을 초과하는 경우에는 최소 원소를 제거
if a < len(q):
heapq.heappop(q)
print(sum(q))
4. Java 문제풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Queue<int[]> q = new PriorityQueue<>((a, b) -> a[0]-b[0]);
for (int i=0; i<n; i++)
q.add(Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray());
PriorityQueue<Integer> arr = new PriorityQueue<>();
long result = 0;
while (!q.isEmpty()){
int[] a = q.poll();
arr.add(a[1]);
if (arr.size() > a[0]) arr.poll();
}
while (!arr.isEmpty()) result += arr.poll();
System.out.println(result);
}
}
댓글남기기