[프로그래머스] 레벨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을 나눈 나머지를 구하는 문제인줄 알았다.
뭔가 이상하더라니.. 아무튼 재귀로도 풀어보고(물론 타임아웃이 발생했지만) 다른 방식으로도 풀어서 만족한다.
(근데 점수 많이줌..)