2021. 11. 11. 02:10ㆍ알고리즘/그리디
문제
한 저명한 학자에게 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만큼의 돈을 벌 수 있다.
입력
첫째 줄에 정수 n이 주어진다. 다음 n개의 줄에는 각 대학에서 제시한 p값과 d값이 주어진다.
출력
첫째 줄에 최대로 벌 수 있는 돈을 출력한다.
예제 입력 1
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
예제 출력 1
185
접근 방법
- 0. 주어진 강연정보를 각 대학별 날짜를 기준으로 오름차순 정렬하고, 강연 페이를 기준으로 하는 최소힙을 초기화한다.
- 1. 강연정보를 하나씩 탐색하며 최소힙의 길이보다 현재 탐색중인 날짜가 크다면 이를 최소힙에 삽인한다.
- 2. 만약 최소힙의 길이가 현재 탐색중인 날짜보다 같다면 최소힙의 0번째 인덱스와 현재 탐색중인 강연의 급여를 비교해 더 큰 값을 삽입하고 작은 값은 최소힙에 넣지 않거나 뺀다.
- 모든 탐색이 끝난 뒤, 최소힙을 모두 합해 값을 출력한다.
코드
# https://www.acmicpc.net/problem/2109
# 접근 방법
# 0. 주어진 강연정보를 각 대학별 날짜를 기준으로 오름차순 정렬하고, 강연 페이를 기준으로 하는 최소힙을 초기화한다.
# 1. 강연정보를 하나씩 탐색하며 최소힙의 길이보다 현재 탐색중인 날짜가 크다면 이를 최소힙에 삽인한다.
# 2. 만약 최소힙의 길이가 현재 탐색중인 날짜보다 같다면 최소힙의 0번째 인덱스와 현재 탐색중인 강연의 급여를 비교해 더 큰 값을 삽입하고 작은 값은 최소힙에 넣지 않거나 뺀다.
# 모든 탐색이 끝난 뒤, 최소힙을 모두 합해 값을 출력한다.
import sys, heapq
input = sys.stdin.readline
n = int(input())
array = [list(map(int, input().split())) for _ in range(n)]
array.sort(key=lambda x: x[1])
min_heap = []
for pay, day in array:
if day > len(min_heap):
heapq.heappush(min_heap, pay)
else:
if min_heap[0] < pay:
heapq.heappop(min_heap)
heapq.heappush(min_heap, pay)
total_pay = sum(min_heap)
print(total_pay)
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 15922번: 아우으우아으이야 (파이썬 / 백준 골드문제) (0) | 2021.11.12 |
---|---|
백준 온라인 저지, 그리디 / 2812번: 크게만들기 (파이썬 / 백준 골드문제) (0) | 2021.11.12 |
백준 온라인 저지, 그리디 / 2212번: 센서 (파이썬 / 백준 골드문제) (0) | 2021.11.11 |
백준 온라인 저지, 그리디 / 1026번: 보물 (파이썬) (0) | 2021.11.11 |
백준 온라인 저지, 그리디 / 2170번: 선긋기 (파이썬 / 백준 골드문제) (0) | 2021.11.09 |