이 문제에서는 급수 1/(1×2) + 1/(2×3) + … + 1/(n×(n+1))의 제 n항을 나타내는 숫자 n이 주어집니다. 우리의 과제는 이 급수의 합을 구하는 프로그램을 작성하는 것입니다.
예시를 통한 문제 이해
입력
n = 3
출력
0.75
설명 — 합 = 1/(1×2) + 1/(2×3) + 1/(3×4) = 1/2 + 1/6 + 1/12 = (6+2+1)/12 = 9/12 = 3/4 = 0.75
가장 간단한 풀이 방법은 반복문을 사용해 급수의 각 항 값을 하나씩 계산한 뒤, 모두 더해 합을 구하는 것입니다.
방법 1: 반복문을 이용한 풀이
알고리즘
sum = 0으로 초기화
1단계: i = 1부터 n까지 반복하며 다음을 수행
1.1단계: sum += 1 / (i * (i+1)) 로 합을 갱신
2단계: sum 출력
예제 코드
풀이 과정을 보여주는 C++ 프로그램입니다.
#include <iostream>
using namespace std;
double calcSeriesSum(int n) {
double sum = 0.0;
for (int i = 1; i <= n; i++)
sum += ((double)1 / (i * (i + 1)));
return sum;
}
int main() {
int n = 5;
cout << "급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: " << calcSeriesSum(n);
return 0;
}
실행 결과
급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: 0.833333
이 방법은 정확하게 동작하지만, 반복문을 사용하기 때문에 시간 복잡도가 O(n)입니다. 따라서 n이 매우 커지면 성능이 떨어질 수 있습니다.
방법 2: 일반 공식을 이용한 효율적인 풀이
훨씬 효율적인 접근 방식은 급수의 합에 대한 일반 공식을 유도하는 것입니다. 이 급수는 망원급수(telescoping series)의 성질을 가지며, 전개하면 인접한 항들이 서로 상쇄됩니다.
급수: 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... n번째 항: an = 1/n(n+1) an = ((n+1) - n) / n(n+1) an = (n+1)/n(n+1) - n/n(n+1) an = 1/n - 1/(n+1) 급수의 합: sum = 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 각 항을 위 공식으로 변형하면, sum = 1/1 - 1/2 + 1/2 - 1/3 + 1/3 - 1/4 + 1/4 - 1/5 + ... + 1/n - 1/(n+1) 중간 항들이 모두 상쇄되므로, sum = 1 - 1/(n+1) sum = (n+1-1)/(n+1) = n/(n+1)
즉, 이 급수의 합은 n/(n+1)이라는 아주 간단한 공식으로 표현할 수 있습니다.
예제 코드
#include <iostream>
using namespace std;
double calcSeriesSum(int n) {
return ((double)n / (n + 1));
}
int main() {
int n = 5;
cout << "급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: " << calcSeriesSum(n);
return 0;
}
실행 결과
급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: 0.833333
마무리
두 방법 모두 동일한 결과를 반환하지만, 공식 기반 풀이는 반복 없이 단 한 번의 연산으로 답을 구하므로 시간 복잡도가 O(1)입니다. 입력 크기와 무관하게 즉시 결과를 얻을 수 있어, 실전 코딩 테스트에서는 망원급수 공식을 활용한 두 번째 방법이 훨씬 유리합니다.