프로그래머스 레벨 1의 "부족한 금액 계산하기" 문제다. 아래 3개 파라미터를 받는다.
price
: 놀이기구의 이용료money
: 고객이 가지고 있는 금액count
: 고객이 해당 놀이기구를 이용한 횟수놀이기구를 이용한 횟수가 늘어날 때마다 횟수 만큼의 이용료를 더 받는다. 놀이기구의 이용료 price
가 100원이라면 1번 이용할 땐 100원, 2번 이용할 땐 200원, 3번 이용할 땐 300원이 된다. 놀이기구를 count
번 탔을 때 money
금액에서 얼마나 모자라는지를 반환해야 된다. 금액이 모자라지 않으면 0을 반환한다.
반복문을 이용하면 아래처럼 쉽게 풀 수 있다.
function solution(price, money, count) {
let sum = 0;
for (let i = 1; i <= count; i += 1) {
sum += price * i; // 3 + 6 + 9 + 12 = 30
}
return sum <= money ? 0 : sum - money; // 30 - 20 = 10
}
solution(3, 20, 4) // 10
아래는 좋아요를 가장 많이 받은 다른 사람의 풀이다. 봐도 잘 이해가 안됐다. 댓글을 살펴보니 가우스 공식을 활용했다는걸 알게됐고, 찾아보다가 등차수열(고1 수학)도 공부하게 됐다.
function solution(price, money, count) {
const tmp = (price * count * (count + 1)) / 2 - money;
return tmp > 0 ? tmp : 0;
}
1부터 100까지 수를 모두 더할 때 $1 + 100 = 101$, $2 + 99 = 101$, $3 + 98 = 101$... 모두 101이 나온다. $50 + 51 = 101$ 까지 계속 반복해서 101을 50번 더하면 1~100까지 수의 합이 된다.
따라서 1~100까지 수의 합은 $101 * 50 = 5050$이 된다. 1씩 증가하는 수열은 아래처럼 공식화할 수 있다.
n = 마지막 수(1부터 1씩 증가하는 수열에선 가장 마지막 수가 항의 개수)
101(n + 1)을 50(n / 2)로 곱하면 1~100까지의 모든 합이 된다. 혹은...
101(n + 1)을 100(n)으로 곱한 뒤 2로 나누면 1~100까지의 모든 합이 된다.
**(n + 1) * n / 2**
마지막 수(항의 개수)에서 2를 나누는 이유는? 항 개수 절반 지점을 넘을때부터 이미 더했던 수를 중복해서 더하기 때문이다.
47 + 54
48 + 53
49 + 52
**50 + 51
------- 중간 지점**
51 + 50
52 + 49
53 + 48
54 + 47
...