
1부터 n의 합을 구하는 프로그램을 구현하세요.
n은 0보다 크고 1000보다 작습니다.
수학에서 등차수열이란, 연속하는 두 항의 차이가 일정한 수열을 뜻합니다. 이때 두 항의 차이는 공차라고 하며, 아래와 같이 나타낼 수 있습니다.
F(n) = F(n-1) + d (공차)
1부터 n의 합을 구하는 식은 공차가 1인 등차수열을 구하는 것과 같습니다.
따라서 프로그램을 구현하는 방법은 두 가지로 나눌 수 있습니다.
function solution(n) {
let answer = 0;
if ( 0 <= n && n <= 1000 ) {
for(let i = 1; i <= n; i++) {
answer += i;
}
}
return answer;
}
이는 팩토리얼 함수를 구했던 방식과 같습니다.
공차가 1이기 때문에, for 루프는 1부터 n까지 반복하면서 각 숫자를 answer에 더합니다. 이는 1부터 n까지의 등차수열의 합을 계산하는 부분입니다.
예를 들어, solution(3)을 호출하면 1 + 2 + 3 = 6이므로 함수는 6을 반환합니다.
function solution(n) {
return n*(n+1)/2;
}
조금 더 수학적으로 접근한다면 이렇게 작성할 수 있습니다. 이는 등차수열의 공식을 살펴봐야 합니다.
등차수열 1,2,3,4,5 를 이루는 항들의 합을 구한다고 할 때,
S = 1 + 2 + 3 + 4 + 5
S = 5 + 4 + 3 + 2 + 1
즉, 제 1항 + 5항 = 6
제 2항 + 4항 = 6
제 3항 + 3항 = 6 입니다.
따라서 2S = 6 * 3이며, S는 6*3/2 = 9입니다.
등차수열 F(n)의 1항부터 n항까지 합을 구한다고 가정할 때 아래와 같이 표현할 수 있습니다.
S(n) = F(1) + F(2) + F(3) + ... + F(n-1) + F(n)
첫째항이 F(1), 공차가 d인 등차수열의 일반항은 아래와 같습니다.
F(1) = F(1)
F(2) = F(1) + d
F(3) = F(2) + d = F(1) + d + d = F(1) + 2d
F(4) = F(3) + d = F(1) + 2d + d = F(1) + 3d
...
F(n) = F(n-1) + d = F(1) + (n-1)d
따라서 이를 위와 같이 반대로 정렬하여 합해보면,
S(n) = F(1) + (F(1) + d) + (F(1) + 2d) + ... + (F(n)-2d) + (F(n)-d) + 1
S(n) = F(n) + (F(n)-d) + (F(n)-2d) + ... + (F(1) + 2d) + (F(1) + d) + F(1)
--
2S(n) = (F(1) + F(n)) + (F(1) + F(n)) + ... + (F(1) + F(n)) + (F(1) + F(n))
= (F(1) + F(n))n
따라서 S(n) = (F(1) + F(n))n / 2 이라는 공식이 도출됩니다.
우리는 첫 항이 1, 최종 항이 n이므로 이를 코드에 적용하면 결국 위와 같은 식이 나오게 되는 것입니다.