프로그래머스 | 등차수열의 합 구하기

chaen·2024년 1월 18일
post-thumbnail

📌 문제

1부터 n의 합을 구하는 프로그램을 구현하세요.
n은 0보다 크고 1000보다 작습니다.

✨ 해결 방법

수학에서 등차수열이란, 연속하는 두 항의 차이가 일정한 수열을 뜻합니다. 이때 두 항의 차이는 공차라고 하며, 아래와 같이 나타낼 수 있습니다.

F(n) = F(n-1) + d (공차)

1부터 n의 합을 구하는 식은 공차가 1인 등차수열을 구하는 것과 같습니다.
따라서 프로그램을 구현하는 방법은 두 가지로 나눌 수 있습니다.

💻 solution 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을 반환합니다.

💻 solution 2

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이므로 이를 코드에 적용하면 결국 위와 같은 식이 나오게 되는 것입니다.

참고
1 ~ n까지 합을 구하는 원리
등차수열의 합, 등차수열의 합 공식

0개의 댓글