[파이썬 코딩테스트] 부족한 금액 계산하기

ch.2·2024년 7월 10일
0

코딩 테스트

목록 보기
8/21
post-thumbnail

문제

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

프로그래머스 파이썬 예제에 문장형 문제가 나왔다.

첫 번째 시도

def solution(price, money, count):
    m_for_pay = count * price # 지불해야 할 금액
    deficient_m = money - m_for_pay # 모자란 금액
    if m_for_pay < money:
        deficient_m = 0
    #answer = 0
    return deficient_m
  • 지불해야 할 금액과 모자란 금액의 변수를 설정했다.
  • 하지만 지불해야 할 금액 변수에서 count가 증가할수록 지불해야 할 금액누적되어 증가하는 조건을 반영하지 못했다.

두 번째 시도

def solution(price, money, count):
    m_for_pay = count * price
    for i in price*count:
        m_for_pay += i
    deficient_m = money - m_for_pay 
    if m_for_pay < money: 
        deficient_m = 0 
    return deficient_m
  • 반복문으로 누적되어 증가하는 조건을 반영하고자 했지만 잘못된 방식으로 작성했다.
  • price*count는 단순히 이용 횟수와 단가의 곱을 나타내므로 반복문의 대상으로 사용하는 것은 적절하지 않다. 반복문 for 문에서 in 뒤에 오는 값은 데이터 시퀀스여야 한다.
  • 반복문의 대상이 되어야 하는 것은 이용 횟수이다. 이용 횟수를 반복하며 각 이용 횟수에 대한 금액을 계산해야 한다.

세 번째 시도

def solution(price, money, count):
    m_for_pay = 0
    for i in range(1, count+1):
        money -= price*i
        if price*i < money:
            money = 0
    return money
  • m_for_pay 변수를 설정하고 사용하지 않았다.
  • 계산값을 return 하기 위해 money 변수를 자체를 0으로 만들고 money 변수를 return 하는 건 좋지 않은 방식이다.
    → 디버깅 및 유지보수 어려움
    데이터 무결성 위반
    : 함수의 입력 매개변수인 money는 함수 내부에서 변경되어서는 안 된다.

네 번째 시도

def solution(price, money, count):
    m_for_pay = 0
    for i in range(1, count+1):
        m_for_pay += price*i
        
    money -= m_for_pay
    
    if money > 0 :
            return 0
    return money
  • 여전한 데이터 무결성 위반.
  • 모자란 금액을 return 하는 것이 조건인데 money 변수가 음수가 되었다.

다섯 번째 시도

def solution(price, money, count):
    m_for_pay = 0
    for i in range(1, count+1):
        m_for_pay += price*i
        
    money -= m_for_pay
    
    if money > 0 :
            return 0
    return abs(money)
  • money 변수에 절댓값을 씌워주는 abs()을 사용하여 return하도록 했다.

코딩 식 줄이기

def solution(price, money, count):
    m_for_pay = 0
    for i in range(1, count+1):
        m_for_pay += price*i
    return max(m_for_pay - money, 0)
  • 데이터 무결성을 지켰다.
  • 이전에는 if 문으로 money의 양수인 경우, 음수인 경우를 판별했는데, max() 함수를 이용하여 조금 더 직관적으로 보이도록 했다.
    - max() 함수
    max(arg1, arg2, *args)
    : arg1과 arg2는 비교할 값들. 여러 개의 값을 넣을 수 있다.
    두 개 이상의 값 중에서 가장 큰 값을 반환한다.

profile
데이터 분석 공부중

0개의 댓글