알고리즘/다이나믹프로그래밍
[BOJ/백준][Bronze II] 2747: 피보나치 수(Kotlin)
꼬물쥰
2022. 7. 2. 21:08
문제
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다.
그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.
n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.
입출력
입력 : 첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다
출력 : 첫째 줄에 n번째 피보나치 수를 출력한다.
입력 | 출력 |
10 | 55 |
접근방법
이 문제는 문제에 식이 나와 있었고, 재귀로 풀어봤던 문제라 금방 풀었다
다이나믹 프로그래밍 Bottom-up방식으로 풀어봤다
Bottom-up 방식은 말 그대로 작은 문제들부터 답을 구해가며 전체 문제의 답을 찾는 방식이다
우선 피보나치 수를 저장할 배열을 하나 만든다
구해야하는 피보나치 수를 입력받아 반복문을 이용해 피보나치 수를 구한 후 배열에 저장한다
0번째 피보나치 수는 0, 1번째 피보나치 수는 1, 이후 피보나치 수는 바로 앞 두 수의 합이다.
-> 피보나치 배열은 각 인덱스 값으로 초기화
입력 값이 2이상이면 반복문으로 입력값까지 피보나치 수를 구한다
코드
import java.util.*
fun main(){
val sc: Scanner = Scanner(System.`in`)
var n = sc.nextInt()
var dp = IntArray(n + 1){i -> i}
for(i in 2..n){
dp[i] = dp[i - 1] + dp[i - 2]
}
println(dp[n])
}
Bottom-up 방식
import java.util.*
var dp = intArrayOf()
fun main(){
val sc: Scanner = Scanner(System.`in`)
var n = sc.nextInt()
dp = IntArray(n + 1){
if(it == 0 || it == 1) 1
else -1
}
println(solve(n))
}
fun solve(n: Int): Int{
if(n == 0 || n == 1) return n
if(dp[n] != -1) return dp[n]
dp[n] = solve(n - 1) + solve(n - 2)
return dp[n]
}
Top-down방식