ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 피보나치 수
    Algorithm 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

    'Algorithm' 카테고리의 다른 글

    실패율  (0) 2021.05.24
    짝지어 제거하기  (0) 2021.05.21
    내적  (0) 2021.05.19
    음양 더하기  (0) 2021.05.18
    튜플  (0) 2021.05.17
Designed by Tistory.