Hanbit the Developer

[Python] 백준 12018번: Yonsei TOTO 본문

Algorithm/백준

[Python] 백준 12018번: Yonsei TOTO

hanbikan 2021. 6. 8. 22:04

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

 

12018번: Yonsei TOTO

연세대학교 수강신청이 얼마 전부터 바뀌어, 마일리지 제도로 바뀌었다. 이 제도는 각각의 학생들에게 마일리지를 주어 듣고 싶은 과목에 마일리지를 과목당 1~36을 분배한다. 그리고 모두 분배

www.acmicpc.net

import sys
input = sys.stdin.readline


def getMinMileage(p, l, nums):
    minMileageIndex = p - l
    if minMileageIndex < 0:
        return 1
    else:
        nums.sort()
        return nums[minMileageIndex]


def getMaxClassCount(m, mileages):
    maxClassCount = 0
    mileages.sort()

    for mileage in mileages:
        m -= mileage
        if m < 0:
            break

        maxClassCount += 1

    return maxClassCount


if __name__ == '__main__':
    n, m = map(int, input().split())
    mileages = []

    # input / set mileages
    for i in range(n):
        p, l = map(int, input().split())
        nums = list(map(int, input().split()))

        mileages.append(getMinMileage(p, l, nums))

    # spend mileages / output
    maxClassCount = getMaxClassCount(m, mileages)
    print(maxClassCount)

각 과목별로, 해당 과목을 듣기 위해 소비해야할 최소 마일리지를 계산해내어(getMinMileage() 함수) mileages에 저장한다. 이 때 수강인원이 신청인원보다 많을 경우에는 바로 1을 반환하고, 아닐 경우에는 다른 학생들이 신청한 마일리지들을 오름차순으로 정렬한 뒤, (신청 인원) - (수강 인원)의 인덱스의 값을 반환해준다.

이후에는 해당 마일리지들을 오름차순으로 정렬한 뒤 이를 순차적으로 돌면서, 입력받은 m을 감소시키고, m이 0 미만이 될 경우 더이상 신청할 수 없으므로 break로 탈출해준다. 만약 m이 아직 0 이상일 경우에는 maxClassCount를 증가시키면 된다. maxClassCount가 곧 신청한 클래스의 개수이므로 해당 변수를 출력해주면 된다.