-
아래 문제는 프로그래머스에서 제공하는 피보나치 수의 문제입니다🧑🏻💻
문제 제시
- 피보나치 수는 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
문제 해결
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와 같다는 성질이라고 합니다.
그래서 미리 나눠줘도 무방하죠.저도 아직 왜...라는 의문이 있지만 정해진 규칙 처럼 그렇다고 하네요..? 수학적인 부분... 너무 어렵 ㅎㅎ🥲
[참고자료]
- 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.