Algorithm

피보나치 수

GREEN.1229 2021. 5. 20. 11:01

아래 문제는 프로그래머스에서 제공하는 피보나치 수의 문제입니다🧑🏻‍💻

문제 제시

  • 피보나치 수는 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이하인 자연수입니다.
  • 입출력 예
    3 2
    5 5
    피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.

문제 해결

import Foundation

func solution(_ n:Int) -> Int {
    var result: [Int] = [0, 1]
    
    for i in 2...n {
        result.append((result[i - 2] + result[i - 1]) % 1234567)
    }
    
    return result[n]
}

사용된 개념

 - 반복문

 - 모듈러 연산의 성질

문제 뒷담화

이번 문제는 모듈러 성질을 알아야하는것이였습니다.

우선 피보나치를 구하기 위해 재귀함수 대신 반복문을 사용했습니다.

재귀함수로 할 시 성능이 더 유리하진 않았습니다.

그래서 먼저 1,2 번째 데이터는 미리 넣어주고 반복을 돌며 앞과 앞앞의 데이터를 더하고 요구하는 나눗셈을 해준뒤

결과 배열에 추가해줬습니다.

처음 아래와 같이 리턴 시 값을 나눠 줬는데 코어 덤프가 났습니다..

import Foundation

func solution(_ n:Int) -> Int {
    var result: [Int] = [0, 1]
    
    for i in 2...n {
        result.append(result[i - 2] + result[i - 1])
    }
    
    return (result[n] % 1234567)
}

위와 같을 시 점점 배열이 불어날수록 값이 커져 Int 범위를 넘어서게 되었습니다.

그래서 모듈러 성질에는 (A + B) % C의 값은 ( ( A % C ) + ( B % C) ) % C와 같다는 성질이라고 합니다.

그래서 미리 나눠줘도 무방하죠.저도 아직 왜...라는 의문이 있지만 정해진 규칙 처럼 그렇다고 하네요..? 수학적인 부분... 너무 어렵 ㅎㅎ🥲

 

 

[참고자료]

https://programmers.co.kr/learn/courses/30/lessons/12945