문제
스타박스는 손님을 입장시킬 때 독특한 방법으로 입장시킨다.
스타박스에서는 손님을 8시가 될 때 까지, 문앞에 줄 세워 놓는다. 그리고 8시가 되는 순간 손님들은 모두 입구에서 커피를 하나씩 받고, 자리로 간다. 강호는 입구에서 커피를 하나씩 주는 역할을 한다.
손님들은 입구에 들어갈 때, 강호에게 팁을 준다. 손님들은 자기가 커피를 몇 번째 받는지에 따라 팁을 다른 액수로 강호에게 준다. 각 손님은 강호에게 원래 주려고 생각했던 돈 - (받은 등수 - 1) 만큼의 팁을 강호에게 준다. 만약, 위의 식으로 나온 값이 음수라면, 강호는 팁을 받을 수 없다.
예를 들어, 민호는 팁을 3원 주려고 했고, 재필이는 팁을 2원, 주현이가 팁을 1원 주려고 한 경우를 생각해보자.
민호, 재필, 주현이 순서대로 줄을 서있다면, 민호는 강호에게 3-(1-1) = 3원, 재필이는 2-(2-1) = 1원, 주현이는 1-(3-1) = -1원을 팁으로 주게 된다. 주현이는 음수이기 때문에, 강호에게 팁을 주지 않는다. 따라서, 강호는 팁을 3+1+0=4원을 받게 된다.
스타박스 앞에 있는 사람의 수 N과, 각 사람이 주려고 생각하는 팁이 주어질 때, 손님의 순서를 적절히 바꿨을 때, 강호가 받을 수 잇는 팁의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 스타박스 앞에 서 있는 사람의 수 N이 주어진다. N은 100,000보다 작은 자연수이다. 둘째 줄부터 총 N개의 줄에 각 사람이 주려고 하는 팁이 주어진다. 팁은 100,000보다 작거나 같은 자연수이다.
출력
강호가 받을 수 있는 팁의 최댓값을 출력한다.
풀이
주려고 했던 돈 - ( 받은 등수 -1 ) 만큼 팁을 받고 음수의 경우는 0으로 계산하기 때문에
팁을 가장 많이 받기 위해서는 주려고 했던 돈을 내림차순으로 정렬하여 계산하면 된다.
따라서 입력값을 sorted함수를 통해 내림차순으로 정렬하고
반복문을 통해 값을 계산한다. 음수가 나올 경우 0으로 계산한다.
import sys
n = int(sys.stdin.readline().rstrip("\n"))
values = []
for _ in range(n):
values.append(int(sys.stdin.readline().rstrip("\n")))
values = sorted(values,reverse=True)
coin=0
for i in range(len(values)):
temp = values[i]-((i+1)-1)
if(temp<0):
temp=0
coin+=temp
print(coin)
'백준 그리디 알고리즘' 카테고리의 다른 글
[백준 2109 파이썬] 순회 공연 그리디 알고리즘 (0) | 2020.12.22 |
---|---|
[백준 2138 파이썬] 전구와 스위치 그리디 알고리즘 (0) | 2020.12.22 |
[백준 17609 파이썬] 회문 그리디 알고리즘 (0) | 2020.12.22 |
[백준 1781 파이썬] 컵라면 그리디 알고리즘 (0) | 2020.12.19 |
[백준 2873 파이썬] 롤러코스터 그리디 알고리즘 (0) | 2020.12.18 |