[코테] 부족한 금액 계산하기

JulyK9·2023년 1월 9일
0

문제

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

제출코드

function solution(price, money, count) {
    
    // 총금액 구하기
    let totalPrice = 0
    for(let i = 1; i <= count; i++) {
        totalPrice += price * i    
    }
    
    // 현재 내가 가진 돈의 상태
    let myPocket = money - totalPrice
    
    // 금액이 모자라지 않을 때
    if(myPocket >= 0) {
        return 0
    } 
    // 금액이 모자랄 때
    else {
        return Math.abs(myPocket);
    }
}

접근과정

  • 발생한 총비용을 구하려면 탈때마다 증가하는 금액을 계산해줘야 하므로 반복문 생각
  • 모자라지 않을 때가 엣지케이스이므로 먼저 분기해주고 나머지를 표현
  • 계산후 모자라는 금액의 음수 표현은 Math.abs() 절대값 메서드로 전환해서 리턴
  • 회고
    - 생각해보니 메서드를 쓸 필요없이 모자라는 거니까 totalPrice - money 를 빼줘도 됨

다른풀이

function solution(price, money, count) {
    const tmp = price * count * (count + 1) / 2 - money;
    return tmp > 0 ? tmp : 0;
}

가우스 덧셈 이라는 개념을 활용!
1에서 n 까지의 총합은 n(n+1)/2 이다.
어렸을때 봤던 것 같기도 한데.. 기억이.. 쿨럭..
내용인즉슨
처음과 끝의 수를 더하면서 안쪽으로 들어가면 계속 같은 값이 나오는데
그 합은 n+1이고, 그 횟수는 n/2 만큼 진행됨
따라서 해당 횟수만큼의 총합은 (n+1) x n/2 가 됨
여기서 1이 최소값이고 n이 최대값이므로
위 케이스에 적용하면 count(count+1)/2 가 됨
그런데 이 문제에선는 count가 아니라 price가 계속 배수만큼 증가되고
이것을 더해주어야 하므로
price x (count + 1) x count / 2 가 되는 것임
조금 풀어서 생각해보면..

  • count의 지속적 증가 : 1, 2, 3, 4, 5 ...
    => (5 + 1) x 5/2
  • price의 지속적 증가 : 100, 200, 300, 400, 500 ...
    => 100x(5 + 1) x 5/2

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글