let n = Int(readLine()!)!
// 메모이제이션 할 배열
var dp = [0, 1]
// 40까지 반복
for i in 2...40 {
dp.append(dp[i-2] + dp[i-1])
}
// 아래 설명 참고
print(dp[n], n-2)
재귀 함수와 다이나믹 프로그래밍의 시간복잡도 차이를 실감나게 이해시키려는 문제인데,
우선 생각해보면 좋은 것이,
즉, 호출 횟수(n)가 결국 피보나치 수열의 n번째 요소와 동일하게 이루어지고 있다.
그럼 출력부분에서 dp[n] 을 그대로 출력하면 재귀 호출 횟수가 나타날 것이고,
다이나믹 프로그램 방식은 이미 이전 값들은 배열에 값이 있을테니 횟수는 단순하게 n-2 이다.
이미 주어진 점화식을 갖고 코드를 작성하는 문제로
이 문제를 해결하기 위해서는 2가지를 수행하면 된다.