이 문제에서는 하나의 숫자 N이 주어지며, C++로 주어진 급수의 N번째 항을 구하는 프로그램을 작성하는 것이 목표입니다.
문제 설명
다음과 같은 급수가 주어졌을 때 −
1, 1, 2, 3, 4, 9, 8, 27, 16, 81, 32, 243, 64, 729, 128, 2187, 256, ... N개의 항
우리는 이 급수의 일반항을 찾아내야 합니다.
예제를 통해 문제를 이해해 보겠습니다.
예제 1
입력
N = 6
출력
9
예제 2
입력
N = 13
출력
64
풀이 접근법
이 문제를 해결하려면 급수를 주의 깊게 관찰해야 합니다. 이 급수는 혼합(mixture) 형태의 수열로, 처음에는 패턴을 인식하기 어렵지만 규칙을 발견하고 나면 비교적 쉽게 다룰 수 있습니다.
이 급수는 다음과 같은 유형의 혼합 급수입니다.
- 홀수 번째 위치: 2의 거듭제곱 수열 (1, 2, 4, 8, 16, ...)
- 짝수 번째 위치: 3의 거듭제곱 수열 (1, 3, 9, 27, 81, ...)
즉, 두 개의 기하급수적 부분 수열이 교대로 배치된 구조입니다. 이를 바탕으로 일반항은 다음과 같이 유도할 수 있습니다.
TN = 2N/2, N이 홀수인 경우 (정수 나눗셈)
TN = 3(N−1)/2, N이 짝수인 경우 (정수 나눗셈)
예를 들어 N = 13(홀수)이면 26 = 64이고, N = 14(짝수)이면 36 = 729가 됩니다.
예제 코드
#include <iostream>
#include <math.h>
using namespace std;
int findNTerm(int N) {
if(N % 2 == 0){
return pow(3, ((N-1)/2));
}
else
return pow(2, (N/2));
}
int main() {
int N = 9;
cout<<N<<"th term of the series is "<<findNTerm(N)<<endl;
N = 14;
cout<<N<<"th term of the series is "<<findNTerm(N);
}출력
9th term of the series is 16 14th term of the series is 729
복잡도 분석
이 풀이는 반복문 없이 일반항 공식만으로 답을 계산하므로 시간 복잡도는 O(log N)(거듭제곱 연산 기준)이며, 각 항을 하나씩 계산하는 O(N) 방식보다 훨씬 효율적입니다. 또한 공간 복잡도는 O(1)로 추가적인 메모리가 필요하지 않습니다.