문제 개요
이 문제에서는 수열 0.7, 0.77, 0.777…의 첫 n항이 주어지며, n항까지의 합을 구하는 프로그램을 작성하는 것이 목표입니다. 단순히 반복문으로 항을 더하는 방법도 있지만, 수학적 공식을 유도하면 반복문 없이 한 번의 계산으로 답을 얻을 수 있어 훨씬 효율적입니다.
예시로 문제 이해하기
입력: 4
출력: 3.0247
설명: 0.7 + 0.77 + 0.777 + 0.7777 = 3.0247
접근 방법: 수열의 합 일반 공식 유도
각 항은 7 × (0.1 + 0.01 + 0.001 + …) 형태로 분해할 수 있으며, 여기에 등비수열의 합 공식을 적용하면 다음과 같이 정리됩니다.
sum = 0.7 + 0.77 + 0.777 + ... (n항까지)
sum = 7 × (0.1 + 0.11 + 0.111 + ... n항까지)
sum = 7 × (9/9) × (0.1 + 0.11 + 0.111 + ... n항까지)
sum = 7/9 × (0.9 + 0.99 + 0.999 + ... n항까지)
sum = 7/9 × ((1 − 0.1) + (1 − 0.01) + (1 − 0.001) + ... n항까지)
sum = 7/9 × ((1 + 1 + ... n개) − (0.1 + 0.01 + 0.001 + ... n항까지))
sum = 7/9 × (n − (1/10 + 1/100 + 1/1000 + ... n항까지))
sum = 7/9 × (n − 0.1 × (1 − 0.1ⁿ) / (1 − 0.1))
sum = 7/9 × (n − 0.1 × (1 − 0.1ⁿ) / 0.9)
sum = 7/9 × (n − (1 − 10⁻ⁿ) / 9)
sum = 7/81 × (9n − 1 + 10⁻ⁿ)
최종적으로 n항까지의 합은 다음 공식 하나로 계산할 수 있습니다.
합 = 7/81 × (9n − 1 + 10−n)
C++ 구현 예제
위 공식을 활용한 솔루션의 동작을 보여주는 프로그램입니다.
#include <iostream>
#include <math.h>
using namespace std;
float calcSeriesSum(int n) {
return (0.08641 * (9 * n - 1) + pow(10, (-1) * n));
}
int main() {
int n = 5;
cout << "수열 0.7, 0.77, 0.777, ... 의 " << n << "항까지의 합은 " << calcSeriesSum(n);
return 0;
}
실행 결과
수열 0.7, 0.77, 0.777, ... 의 5항까지의 합은 3.80205
마무리
이처럼 등비수열의 합 공식을 활용하면 반복문 없이도 상수 시간 O(1) 안에 수열의 합을 계산할 수 있습니다. n이 아무리 커져도 연산 횟수가 일정하게 유지되므로, 대량의 입력을 처리해야 하는 상황에서 특히 유용한 접근 방식입니다. 참고로 코드에서 사용한 0.08641은 계수 7/81 ≈ 0.08642를 근사한 값입니다.