1. 거스름돈

import sys
def coinChange(n) :
'''
n원을 돌려주기 위해 필요한 동전 개수의 최솟값을 반환하는 함수를 작성하세요.
'''
result = 0
coins = [100, 50, 10, 5, 1]
for coin in coins:
result += n//coin
n = n%coin
return result
def main():
'''
이 부분은 수정하지 마세요.
'''
n = int(input())
print(coinChange(n))
if __name__ == "__main__":
main()
2. 기울기가 가장 큰 두 점 찾기 (Big)

import sys
def getSlope(a,b):
return abs((b[1] - a[1]) / (b[0] - a[0]))
def maxSlope(points) :
'''
n개의 점들 중에서 2개의 점을 선택했을 때, 얻을 수 있는 기울기의 절댓값 중에
서 가장 큰 값을 반환하는 함수를 작성하세요.
**주의** : 소숫점 넷째자리에서 반올림하는 것은 고려할 필요가 없습니다.
이는 main()에서 출력을 할 때에 처리가 되므로,
기울기의 최댓값을 구하는 것에 집중해 주시길 바랍니다.
'''
points.sort()
result = 0
for i in range(len(points)-1):
result = max(result, getSlope(points[i], points[i+1]))
return result
def main():
n = int(input())
points = []
for i in range(n) :
line = [int(x) for x in input().split()]
points.append( (line[0], line[1]) )
print("%.3lf" % maxSlope(points))
if __name__ == "__main__":
main()
3. Fractional knapsack

import sys
def fKnapsack(materials, m) :
'''
크기 m까지 버틸 수 있는 베낭이 담을 수 있는 최대 가치를 반환하는 함수를 작성하세요.
주의 : 셋째 자리에서 반올림하는 것을 고려하지 않고 작성하셔도 됩니다.
물건을 가성비 순서대로 넣기.
x[0] : 무게
x[1] : 가치
'''
materials = sorted(materials, key = lambda x : x[1]/x[0], reverse = True)
weight = 0
value = 0
for i in range(len(materials)):
'''
물건을 넣어도 아직 버틸만한 무게일 때.
물건을 넣으면 딱 m만큼 무게가 될 때.
물건을 다 넣으면 m을 넘어갈 때.
'''
if weight + materials[i][0] < m :
weight += materials[i][0]
value += materials[i][1]
elif weight + materials[i][0] == m :
weight += materials[i][0]
value += materials[i][0]
return value
else:
temp = m- weight
value += temp * (materials[i][1]/materials[i][0])
return value
return value
def main():
line = [int(x) for x in input().split()]
n = line[0]
m = line[1]
materials = []
for i in range(n) :
data = [int(x) for x in input().split()]
materials.append( (data[0], data[1]) )
print("%.3lf" % fKnapsack(materials, m))
if __name__ == "__main__":
main()