피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
n | return |
---|---|
3 | 2 |
5 | 5 |
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.
다이나믹 프로그래밍을 이용하여 계산 결과를 memoization한다.
피보나치 수열을 구현하는 방법에는 크게 3가지가 있다.
해당 문제는 동적 프로그래밍 bottom-up 방식을 사용하여 해결할 수 있다.
1234567
으로 나누는 위치// // 재귀: 실패
// function fibo(n) {
// if(n === 0) return 0;
// if(n === 1) return 1;
// return fibo(n - 1) + fibo(n - 2);
// }
// // 동적 계획법(top-down): 실패
// function fibo(n, d = []) {
// if(n < 2) return n;
// if(d[n]) return d[n];
// d[n] = fibo(n - 1) + fibo(n - 2);
// return d[n] % 1234567;
// }
function solution(n) {
let arr = [0, 1];
// 동적 계획법(bottom-up): 성공
for(let i = 2; i <= n; i++) {
arr[i] = (arr[i - 1] + arr[i - 2]) % 1234567; // 나누는 위치 주의
}
return arr[n];
}
테스트 1 〉 통과 (0.05ms, 29.2MB)
테스트 2 〉 통과 (0.05ms, 30.3MB)
테스트 3 〉 통과 (0.04ms, 30.1MB)
테스트 4 〉 통과 (0.04ms, 29MB)
테스트 5 〉 통과 (0.04ms, 30.3MB)
테스트 6 〉 통과 (0.04ms, 30.2MB)
테스트 7 〉 통과 (0.25ms, 30MB)
테스트 8 〉 통과 (0.10ms, 30.3MB)
테스트 9 〉 통과 (0.07ms, 30.3MB)
테스트 10 〉 통과 (0.15ms, 30.4MB)
테스트 11 〉 통과 (0.11ms, 30.3MB)
테스트 12 〉 통과 (0.12ms, 30MB)
테스트 13 〉 통과 (4.72ms, 34.3MB)
테스트 14 〉 통과 (4.51ms, 34.6MB)