[프로그래머스] 피보나치수 (level 2)

김진권·2021년 8월 25일
0

algorithm

목록 보기
8/10

나의 풀이

function solution(n) {
  // n 번째 피보나치 수를 1234567로 나눈 나머지를 리턴하는 함수를 구하라
  // 1. n번째 피보나치 수를 구하는 함수 : 재귀함수는 안된다.
  if (n === 0) return 0;
  if (n === 1) return 1;
  let pre = 0;
  let cur = 1;
  let acc;

  for (let i = 1; i < n; i++) {
    acc = (pre + cur);
    pre = cur % 1234567;
    cur = acc % 1234567;
  }

  return acc % 1234567;
}

이런 경우 재귀함수는 과도한 스택으로 런타임에러를 발생시킨다.
for 문을 사용해서 해결하자.
피보나치수를 완전히 계산한 후에 1234567로 나누려하면 원하는 결과가 나오지 않는다.

이유는 자바스크립트의 숫자 범위가 (2 ^ 53 - 1) ~ -(2 ^ 53 - 1) 내에 있기 때문에 초과된 수에 대해선 Infinity로 표시되며 Infinity를 1234567로 나누는 연산을 하면 NaN가 나와 원하는 결과가 나오지 않는다.

(1476번째 피보나치 수 까지는 계산 되지만 1477번째 부터 Infinity로 표시된다.)

따라서 (A + B) % C의 값은 ( ( A % C ) + ( B % C) ) % C와 같다는 성질을 이용하여 값을 구한다.

출처 : http://ouoiouoi.blogspot.com/2017/05/javascript-number.html
https://programmers.co.kr/questions/11991

profile
start!

0개의 댓글