일년에 한번 다른 곳으로 여행을 가는 미국 학생 모임이 있습니다.

이번에는 산호세로 여행을 가기로 했습니다.

 

여행 경비를 모두 똑같이 부담하기로 했지만, 돈을 쓸때마다 나눠서 내는건 비효율적입니다.

그래서 한명씩 식비, 숙박비, 교통비를 부담하기로 합니다.

 

여행이 끝나고 정산할 때, 지출한 내역을 조사한 다음, 1센트 단위에서 모든 학생들이 쓴 돈이 같도록 돈을 주고 받습니다.

지출 내역이 주어졌을 때, 모든 학생이 쓴 돈이 1센트 단위 내에서 똑같아지기 위해 전달되어야 하는 최소 액수를 구해봅시다.

 

입력

표준 입력을 통해서 여러 번의 여행 정보가 입력 됩니다.

각 여행은 여행에 참가한 학생 수를 나타내는 정수 n으로 구성됩니다.

이 정수 n 밑으로는 n 개의 줄이 입력이 되는데, 각 줄에는 달러와 센트 단위로 각 학생의 지출한 경비가 입력됩니다.

학생 수는 최대 1000명을 넘지 않으며, 지출한 금액도 $10,000.00 이상을 넘지 않습니다.

마지막 여행에는 0만 들어있는 줄이 입력됩니다. 

 

출력

각 여행에 대해 각 학생이 사용한 금액이 똑같아지기 위해 전달되어야 하는 금액의 총합을 출력한다.

 

예제

3 (입력 시작)

10.00

20.00

30.00

 

$10.00 (출력)

 

4 (입력 시작)

15.00

15.01

3.00

3.01

 

$11.99 (출력)

 

(종료)


해설

학생들 지출 내역을 전부 더해서, 평균 금액을 구합니다.

각자 지출한 돈에서 평균 금액만큼의 차이를 구해서, 전달되어야 하는 금액의 합을 구합니다.

 

금액 차이를 구할 경우, 평균 금액보다 높은 돈을 지출한 경우에만 계산합니다.

낮게 낸 사람은 오히려 받아야 하니까요.

 

그리고 1센트 단위에서 같아야 한다는 말의 의미를 생각해보세요.

그 이하의 금액은 절삭해서 계산해야 하니까, 이 부분 처리에 신경을 써야 합니다.

# TheTrip.py , 0003 quiz
# written by badsaram

import sys
import math

class trip(object) :
    def __init__(self) :
        self.costs = []
        self.members = 4
        
    def isNumber(self, number) :
        try :
            float(number)
            return True
        except ValueError :
            return False

    def inputCost(self) :
        str = input()
        if((str.isdigit() == False) or (str.isdecimal() == False)) :
            print("Not Digit or Not Decimal")
            return False
        
        self.members = int(str)
        if (self.members <= 0) :
            sys.exit()
        
        for i in range(0, self.members) :
            str = input()
            if (self.isNumber(str) == False) :
                print("Not Number or Not Decimal")
                return False
            
            temp = float(str)
            if ((temp < 0.0) or (temp >= 10000.00)) :
                print("0 < cost < 10000")
                
            self.costs.append(float(str))
                
        return True
    
    def calcMinDelivery(self) :
        sum = 0.0
        avg = 0.0
        MinDelivery = 0.0
        
        for cost in self.costs :
            sum += cost
            
        avg = sum / self.members 
        
        for cost in self.costs :
            if (cost > avg) :
                temp = int((cost - avg) * 100) #floor under 0.00
                MinDelivery += (temp / 100)

        return MinDelivery
    
if __name__ == '__main__' :
    obj = trip()
    
    while (True) :
        if (obj.inputCost() == True) :
            print("$%.2f" % obj.calcMinDelivery())

'코딩 테스트' 카테고리의 다른 글

문제 6 : 인터프리터(Interpreter)  (0) 2022.07.28
문제 5 : 그래픽 편집기  (0) 2022.07.27
문제 4 : LCD 디스플레이  (0) 2022.07.26
문제 2 : 지뢰 찾기  (0) 2022.07.18
문제 1 : 3n+1, 콜라츠 추측, 우박 수열  (0) 2022.07.15

+ Recent posts