Coding Test/백준(Python)
[백준/Python] 2109번(그리디)_순회강연
syunze
2023. 11. 13. 17:03
📌문제 유형
그리디, 정렬(골드 Lv.4)
📌문제
2109번: 순회강연
한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.
www.acmicpc.net
📌나의 문제풀이
- (실패)
n = int(input())
list_ = []
for _ in range(n):
list_.append(list(map(int,input().split())))
list_.sort(key = lambda x:[x[1], -x[0]])
# print(list_)
result = 0
if len(list_) > 0:
result = list_[0][0]
day = 1
for i in range(1, len(list_)):
if day == list_[i][1]:
continue
elif day < list_[i][1]:
day = list_[i][1]
result += list_[i][0]
else:
day = list_[i][1]
day += 1
print(result)
📌다른사람의 문제 풀이
- 우선순위 큐 사용
import heapq
n=int(input())
lst=[]
for i in range(n):
lst.append(list(map(int, input().split())))
lst.sort(key=lambda x: (x[1]))
p_list=[]
for i in lst:
heapq.heappush(p_list, i[0])
if (len(p_list)>i[1]):
heapq.heappop(p_list)
print(sum(p_list))
- DP 이용
n = int(input())
dp = [0] * (10001)
memo = []
for _ in range(n):
p,d = map(int,input().split())
memo.append((p,d))
memo.sort(key=lambda x : (-x[0],x[1]))
for i in range(n):
np, nd = memo[i][0], memo[i][1]
for j in range(nd ,0, -1):
if dp[j] == 0:
dp[j] = np
break
print(sum(dp))
📌리뷰
- 이전 날짜에도 순회할 수 있음! 핵심은 순회할 곳 날짜 비교하는 것
728x90