티스토리 뷰

반응형

안녕하세요.

 

오늘은 프로그래머스 난이도 2인 '피보나치 수' 라는 코테의 주관적인 소스 코드를 공유하고자 합니다!

 

난이도 2인것 치고는 자주 나와서 쉽게들 풀 수 있을거라 생각합니다!


문제 설명
피보나치 수는 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은 2 이상 100,000 이하인 자연수입니다.


입출력 예
n return
3 2
5 5
입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.


우선 이 문제의 경우, 쉽게 작성할 수 있다고 생각하고 진행을 했었는데, 그냥 막연하게 F[i] = F[i-1] + F[i-2]로 계산을 진행했습니다!

 

하나의 반복문으로 작성을 해서 코드를 구현해보았습니다.

function solution(n) {
  var arr = [0, 1]
  for (var i = 2; i <= n; i++) {
    arr[i] = (arr[i - 1]) + (arr[i - 2])
  }
  return arr.pop() % 1234567
}

근데 엥..? 

나의 망해버린 테스트..

??????? 이게 뭐야 이거 아니야?? 라고 생각을 했는데.. 혹시 뭔가 놓치고 있는게 아닌가? 하며 문제를 다시 읽어보니 'n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수' 라는게 눈에 띄었습니다.. 

 

혹시, 숫자가 너무 커서 그런가? 싶어서 a % n + b % n = (a + b) % n 을 사용해서 먼저 배열에 %를 한 값을 넣어보자 라는 생각을 하게 되었고 수정한 소스는 다음과 같습니다.

 

function solution(n) {
  var arr = [0, 1]
  for (var i = 2; i <= n; i++) {
    arr[i] = (arr[i - 1] % 1234567) + (arr[i - 2] % 1234567)
  }
  return arr.pop() % 1234567
}

이렇게 하니까.. 너무나 잘되는 것..

 

다시한번 문제를 잘 읽어보자.. 라는 교훈을 얻을 수 있었따....

 

너무 어려운 코딩테스트..

반응형