피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
n은 2 이상 100,000 이하인 자연수입니다.
n return
3 2
5 5
재귀를 이용해 피보나치 수를 구하고 1234567로 나눈 나머지를 구해주었다.
-> 테스트 케이스 7~14에서 시간초과로 통과가 안되었다.
function Fib(v) {
if(v === 1 || v === 2) return 1;
return solution(v-1) + solution(v-2);
}
function solution(n) {
return Fib(n) % 1234567;
}
👿 문제점
n이 매우 큰 경우 n번째 피보나치 수는 언어가 표현할 수 있는 자료형의 범위를 넘어가,
오버플로우
가 발생한다. JS 정수범위가 JAVA INT보단 훨씬 크지만, 그것도 피보나치수 78번째 정도에서 오버된다.⭐️ 해결책
모든 단계에서 % 연산을 사용하여, 모든 연산에서 오버플로우가 일어나지 않게 만들어야 한다.
(A+B)%C = ((A%C)+(B%C))%C
속성을 이용해 숫자가 너무 커지지 않도록 만들어준다.
function fib(v) {
let fib_arr = [0,1,1];
for (let i = 3; i <= v; i++) {
fib_arr[i] = (fib_arr[i-1]%1234567 + fib_arr[i-2]%1234567);
}
return fib_arr[v];
}
function solution(n) {
return fib(n)%1234567;
}