1 minute read

13904번 : 과제

문제 링크

https://www.acmicpc.net/problem/13904

문제 설명

웅찬이는 과제가 많다. 하루에 한 과제를 끝낼 수 있는데, 과제마다 마감일이 있으므로 모든 과제를 끝내지 못할 수도 있다. 과제마다 끝냈을 때 얻을 수 있는 점수가 있는데, 마감일이 지난 과제는 점수를 받을 수 없다.

웅찬이는 가장 점수를 많이 받을 수 있도록 과제를 수행하고 싶다. 웅찬이를 도와 얻을 수 있는 점수의 최댓값을 구하시오.

입력

첫 줄에 정수 N (1 ≤ N ≤ 1,000)이 주어진다.

다음 줄부터 N개의 줄에는 각각 두 정수 d (1 ≤ d ≤ 1,000)와 w (1 ≤ w ≤ 100)가 주어진다. d는 과제 마감일까지 남은 일수를 의미하며, w는 과제의 점수를 의미한다.

출력

얻을 수 있는 점수의 최댓값을 출력한다.

문제 풀이

백준 1781번과 동일한 문제이다.

from heapq import heappush, heappop

n = int(input())
arr = []

for i in range(n) :
    deadline, point = map(int, input().split())
    heappush(arr, (deadline, -point))
    
solve_arr = []

for i in range(n) :
    deadline, point = heappop(arr)
    
    # 현재 저장한 배열의 길이보다 현재 데드라인이 더 크다면 저장할 수 있는 여유가 있기에 저장
    if len(solve_arr) < deadline : 
        heappush(solve_arr, -point)
    
    # 1. 현재 데드라인이 저장된 배열의 길이보다 크거나 같고
    # 2. 현재 문제를 풀었을 때 얻을 수 있는 점수가 이전 저장한 배열의 점수보다 더 많다면 교체 
    elif solve_arr[0] < -point : 
        heappop(solve_arr)
        heappush(solve_arr, -point)    

print(sum(solve_arr))

Comments