본문 바로가기
Algorithm/Python

[Python] 백준 - 12018번 Yonsei TOTO(Priority Queue)

by 힘팽 2022. 2. 24.

◈ 오류 정정 및 피드백 환영

 

12018번: Yonsei TOTO

첫째 줄에는 과목 수 n (1 ≤ n ≤ 100)과 주어진 마일리지 m (1 ≤ m ≤ 100)이 주어진다. 각 과목마다 2줄의 입력이 주어지는데 첫째 줄에는 각 과목에 신청한 사람 수 Pi과 과목의 수강인원 Li이 주어

www.acmicpc.net


🔎문제 분석

데이터를 저장하되 순위를 매겨야 하므로 우선순위 큐(Priority Queue)로 접근하면 된다. 

수강인원보다 신청자가 적은 경우 1만 투자해도 해당 과목을 들을 수 있지만, 같거나 많은 경우에는 커트라인 지점에 있는 사람만큼의 마일리지를 투자하면 된다. 예컨대 1명이 초과된 상황이라면 마일리지가 2번째로 작은 사람만큼의 마일리지만 투자해도 우선수위는 성준이에게 있기 때문에 신청이 가능하다.


import heapq as hq
import sys
input = sys.stdin.readline

n, m = map(int, input().split())
cnt = 0
milege = []
for _ in range(n):
    p, l = map(int, input().split())
    a = list(map(int, input().split()))

    if p>=l:
        res = []
        for i in a:
            hq.heappush(res,i)
        for _ in range(p-l+1):
            mile = hq.heappop(res)
    else:
        mile = 1
    hq.heappush(milege,mile)
    
while milege and True:
    m -= hq.heappop(milege)
    if m<0:
        break
    cnt += 1
print(cnt)

댓글