[프로그래머스] 레벨2 (level2) 피보나치 수
2020년 05월 19일, 09:58
피보나치 수
문제설명
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
- F(2) = F(0) + F(1) = 0 + 1 = 1
- F(3) = F(1) + F(2) = 1 + 1 = 2
- F(4) = F(2) + F(3) = 1 + 2 = 3
- F(5) = F(3) + F(4) = 2 + 3 = 5 와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
제한 사항
- n은 1이상, 100000이하인 자연수입니다.
입출력 예
n return 3 2 5 5
처음 풀이
처음에는 재귀 함수를 이용해서 피보나치를 구현했다.
하지만, 타임아웃으로 실패가 떠서 다른 방법을 사용해서 구했다.
근데 문제를 풀고 나서 다른 사람의 풀이에는 재귀함수로 푸신 분들도 계셨는데, 이는 왜그러는지 잘 모르겠다.
재귀함수코드
function fibonacci(n) {
if (n < 2) return n;
let result1 = fibonacci(n - 1) + fibonacci(n - 2);
return result1;
}
문제풀이
사실, 피보나치 수를 구하는 것은 충분히 문제를 풀어본 사람에게는 어렵지 않을 것이다.
하지만, 문제가 이해가 안되서 이 문제를 삽질을 했는데..
1234567로 모든 수의 나머지를 구해서 더해야 한다..
소스코드
function solution(n) {
var answer = 0;
answer = fibonacci2(n).pop() % 1234567;
return answer;
}
function fibonacci2(n) {
let arr = [0, 1];
for (let i = 0; i < n - 1; i++) {
arr.push((arr[i] % 1234567) + (arr[i + 1] % 1234567));
}
return arr;
}
아쉬운 점 || 느낀 점
사실 문제가 정말 이상하게 적혀있어서 결과 값에만 1234567을 나눈 나머지를 구하는 문제인줄 알았다.
뭔가 이상하더라니.. 아무튼 재귀로도 풀어보고(물론 타임아웃이 발생했지만) 다른 방식으로도 풀어서 만족한다.
(근데 점수 많이줌..)