문제 개요
이 문제에서는 정수 N이 주어지며, 우리의 목표는 1 - 2 + 3 - 4 + 5 - 6 + 7...과 같이 부호가 번갈아 나타나는 교대 급수의 첫 N항까지의 합을 구하는 것입니다.
급수는 다음과 같이 진행됩니다.
1 - 2 + 3 - 4 + 5 - 6 + 7 - 8 + 9 - 10 ...
예제를 통해 문제를 살펴보겠습니다.
입력 : N = 4 출력 : -2
설명 −
1 - 2 + 3 - 4 = -2
풀이 접근 방법
이 문제를 효율적으로 해결하는 핵심은 급수의 일반항을 분석하여 합의 공식을 도출하는 것입니다. 반복문 없이 공식만으로 계산하면 시간 복잡도를 O(1)까지 줄일 수 있어 매우 빠른 처리가 가능합니다.
먼저 몇 가지 값에 대해 급수의 합을 직접 계산해 보며 패턴을 찾아보겠습니다.
- sum(1) = 1
- sum(2) = 1 - 2 = -1
- sum(3) = 1 - 2 + 3 = 2
- sum(4) = 1 - 2 + 3 - 4 = -2
- sum(5) = 1 - 2 + 3 - 4 + 5 = 3
- sum(6) = 1 - 2 + 3 - 4 + 5 - 6 = -3
- sum(7) = 1 - 2 + 3 - 4 + 5 - 6 + 7 = 4
- sum(8) = 1 - 2 + 3 - 4 + 5 - 6 + 7 - 8 = -4
위 결과를 관찰하면 명확한 규칙을 발견할 수 있습니다.
- n이 홀수인 경우 : Sum = (n + 1) / 2
- n이 짝수인 경우 : Sum = -(n / 2)
즉, 짝수 항에서는 음수 절반, 홀수 항에서는 양수 절반이 되는 간단한 공식으로 전체 합을 즉시 구할 수 있습니다.
구현 예제
다음은 위 풀이 방법의 동작을 보여주는 C++ 프로그램입니다.
#include<iostream>
using namespace std;
// N항까지의 급수 합을 계산하는 함수
int calcSumNTerms(int n) {
// n이 짝수인 경우 : 합은 -(n/2)
if(n % 2 == 0)
return ((-1) * (n / 2));
// n이 홀수인 경우 : 합은 (n+1)/2
return ((n + 1) / 2);
}
int main() {
int n = 156;
cout << "N항까지의 급수 합은 " << calcSumNTerms(n);
return 0;
}실행 결과
N항까지의 급수 합은 -78
N = 156은 짝수이므로, 공식에 따라 -(156 / 2) = -78이라는 결과가 출력됩니다. 이처럼 일반항을 찾아 공식화하면 반복 연산 없이 상수 시간 안에 정답을 구할 수 있습니다.