수열 bn이 다음과 같은 점화식으로 정의되어 있다고 가정해 봅시다.
b1 = 1, bn+1/bn = 2n
이때 주어진 n에 대해 log2(bn)의 값을 구하는 것이 목표입니다.
예를 들어 입력값이 6이라면 출력은 15가 됩니다. 그 이유는 log2(bn) = (n × (n - 1)) / 2 이므로, (6 × (6 - 1)) / 2 = 15가 되기 때문입니다.
수학적 풀이 과정
이 문제는 점화식을 단계적으로 전개하여 해결할 수 있습니다.
bn+1/bn = 2n
bn/bn-1 = 2n-1
...
b2/b1 = 21
위의 모든 식을 좌변끼리, 우변끼리 곱하면 다음과 같습니다.
(bn+1/bn) · (bn/bn-1) · ... · (b2/b1) = 2n + (n-1) + ... + 1
분자와 분모의 항들이 서로 약분되므로, 결과는 다음과 같이 정리됩니다.
bn+1/b1 = 2n(n+1)/2
여기서 1 + 2 + 3 + ... + (n-1) + n = n(n+1)/2 공식을 사용했습니다.
초기값 b1 = 1이라고 가정하면,
bn+1 = 2n(n+1)/2
이제 n을 (n+1)로 치환하면,
bn = 2n(n-1)/2
양변에 로그를 취하면 최종 결과를 얻을 수 있습니다.
log2(bn) = n(n-1)/2
파이썬 구현 예제
다음 코드는 위에서 유도한 공식을 파이썬으로 구현한 것입니다.
def add_upto_n(n):
res = (n * (n - 1)) / 2
return res
n = 6
print(int(add_upto_n(n)))입력
6
출력
15
이처럼 복잡해 보이는 점화식 문제도 수학적 유도를 통해 간단한 닫힌 형태(closed form)의 공식으로 변환하면, 반복 계산 없이 O(1) 시간에 답을 구할 수 있습니다.