https://www.acmicpc.net/problem/10870
10870번: 피보나치 수 5
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
동적 계획법(Dynamic Programming)
동적 계획법은 복잡한 문제를 여러 개의 간단한 문제(하위 문제)로 나누어 풀고, 그것을 결합하여 최종적인 문제를 해결하는 것이다. 이때 각 하위 문제들의 답을 저장해놓고 같은 하위 문제가 나타난다면 미리 구한 답을 이용하면 된다. 분할 정복(Divide and Conquer) 방식과 비슷하지만 분할 정복은 하위 문제가 중복되지 않는다는 점이 다르다.
메모이제이션(Memoization)
동일한 문제를 반복해야 할 경우, 미리 계산해서 저장해 둔 결과를 활용하여 중복 연산을 줄이는 방식을 메모이제이션이라고 한다. 동적 계획법은 중복되는 하위 문제를 메모이제이션을 이용해 효율적으로 해결할 수 있다.
출처: https://code-lab1.tistory.com/7 [code_lab]
풀이
- 정답 코드 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
using System;
class Program
{
static int Fiboncci(int n)
{
if (n < 2)
{
return n;
}
else
{
return Fiboncci(n - 1) + Fiboncci(n - 2);
}
}
static void Main()
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine(Fiboncci(n));
}
}
|
cs |
위 코드는 재귀함수만 이용해서 문제를 해결했음.
- 정답 코드 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System;
class Program
{
static int[] num = new int[21];
static int Fiboncci(int n)
{
num[0] = 0;
num[1] = 1;
if (n < 2)
{
return num[n] ;
}
if (num[n] != 0)
{
return num[n];
}
num[n] = Fiboncci(n - 1) + Fiboncci(n - 2);
return num[n];
}
static void Main()
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine(Fiboncci(n));
}
}
|
cs |
위 코드는 다이나믹 프로그래밍을 이용한 Top-down방식을 이용한 재귀함수를 사용했다.
시간은 아래 코드가 조금 더 걸리지만 n값이 커지면 계산이 많이 증가한다. 그래서 다이나믹 프로그래밍을 이용하여 복잡한 문제를 여러 개의 간단한 문제(하위 문제)로 나누어 풀고, 각 하위 문제들의 답을 저장해놓고 같은 하위 문제가 나타난다면 미리 구한 답을 이용하면 된다.
'C# > 백준 알고리즘' 카테고리의 다른 글
2022.02.02 [백준] C# 하노이 탑 이동 순서 (0) | 2022.02.02 |
---|---|
2022.01.28 [백준] C# 별 찍기 - 10 (0) | 2022.01.28 |
2022.01.28 [백준] C# 팩토리얼 (0) | 2022.01.28 |
2022.01.28 [백준] C# 골드바흐의 추측 (0) | 2022.01.28 |
2022.01.27 [백준] C# 베르트랑 공준 (0) | 2022.01.27 |
댓글