본문 바로가기
Algorithm/Baekjoon

2109. 순회강연 (Python)

by 원만사 2022. 7. 3.
반응형

 

 

2109번: 순회강연

한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.

www.acmicpc.net

 

풀이

 뒤에 날짜부터 앞으로 이동해가며 현재 날짜에 강연할 수 있는 강연 리스트 중 가장 높은 강연료를 받을 수 있는 강연을 선택하도록 구현하면 된다. 이를 위해 두 개의 최소힙을 사용하여 하나의 힙에는 모든 강연을 담아두고 뒤에 날짜에 있는 강연들을 하나씩 꺼내가며 현재 날짜에 강연이 가능한 강연들의 강연료에 대하여 또 다른 최소힙에 담아주고 날짜가 바뀔 때마다 해당 최소힙에서 가장 높은 강연료를 꺼내어 더해나간다.

 

코드

import sys
import heapq
input = sys.stdin.readline

if __name__ == '__main__':
    N = int(input())

    maxDay = 0 # 강연 중 가장 기한이 긴 날짜
    q = [] # 강연들을 담아두는 힙 -> (-날짜, 가격)
    priceQ = [] # 현재 강연이 가능한 강연들의 가격을 담아두는 힙 -> (-가격)

    for _ in range(N):
        p, d = map(int, input().split())
        maxDay = max(maxDay, d)
        heapq.heappush(q, (-d, p))

    res = 0

    # maxDay부터 1일까지 거꾸로 진행 
    for day in range(maxDay, 0, -1):
        while q: # q에서 강연 정보를 하나씩 꺼내어 현재 날짜에 강연이 가능한 강연인지 체크한다.
            d, p = heapq.heappop(q)
            d *= -1

            if day > d: # 불가능한 강연이라면 다시 q에 집어넣고 종료한다.
                heapq.heappush(q, (-d, p))
                break

            heapq.heappush(priceQ, -p)

        if priceQ: # 현재 날짜에 강연 가능한 강연들이 있다면 제일 높은 가격을 가진 강연을 강연한다.
            res += -heapq.heappop(priceQ)

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

13913. 숨바꼭질 4 (Python)  (0) 2022.07.04
16938. 캠프 준비 (Python)  (0) 2022.07.04
13023. ABCDE (Python)  (0) 2022.06.30
4386. 별자리 만들기 (Python)  (0) 2022.06.27
4803. 트리 (Python)  (0) 2022.06.26

댓글