1. 문제의 발단.
그렇다. 이유는 없다. 멋있어서 붙여진 이름이라고 한다. 그러니 나처럼 왜 다이내믹 이냐?라는 의문을 품고 이유를 찾게 되면 전혀 없으니 다른 방식으로 이해를 해 보려고 한다.
2. 기본 원리
- 큰 하나의 문제를 위해 그 문제를 새부적인 문제들로 나눠서 이전에 작은 문제를 풀었던 답을 이용해 다음에 나올 문제를 풀고, 마지막에 그 결과들을 합쳐서 큰 문제 하나의 답을 도출 해 낸다.
- 이때, 작은 문제들의 결과를 계속 이용하기 위해 따로 그들을 저장해 놓는다.
- 이는 재귀함수를 이용할 때 사용했던 메모이제이션(Memoization)을 이용하는 것과 같다.
3. 언제 사용하나요?
- 큰 문제를 작은 문제들로 나눠서 생각할 수 있는경우
- 같은 문제를 구할 때, 계속 구할 때마다 답은 같은 경우
4. 다시 돌아온 피보나치
- 피보나치수열을 이용해 알아보자
- 피보나치수열의 경우 계속해서 자신이 구했던 값들을 다시 계산해서 그 자리 위치를 맞추어 계산하게 된다.
- 하지만 이전에 이미 계산한 수를 저장했다가 다시 사용하면 효율을 굉장히 올릴 수 있다.
const fibo = (n, arr = [0]) => {
// 처음 3 보다 작으면 무조건 1이다.
if(n < 3) {
arr[n] = 1;
}
// arr에 작게 나눈 문제들의 답(각각의 이전 fibo의 결과들)이 들어가 있다.
// 만약 찾을 수 없다면?
if(!arr[n]) {
// 계산해서 arr에 넣어준다.
arr[n] = fibo(n - 1) + fibo(n - 2)
}
return arr[n]
}
'Coding > Today I Learned' 카테고리의 다른 글
2021.08.30(Mon.) <Database JOIN을 알아보자> (0) | 2021.08.30 |
---|---|
2021.08.26(Thu.) <SQL의 첫걸음> (0) | 2021.08.26 |
2021.08.24(Tue.) <시간복잡도와 Greedy Algorithm> (0) | 2021.08.24 |
2021.08.23(Mon.) <리눅스의 사용권한> (0) | 2021.08.23 |
2021. 08.13(Fri.) <Redux의 기초> (0) | 2021.08.13 |