๐ ๋์ ํ๋ก๊ทธ๋๋ฐ์ด๋ ?
๋์ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํด์ ๋์ ์ผ๋ก ?!? ํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ฃจ์ด์ง๋ ๊ฑด ์๋๋ค ใ ใ ใ
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฒ์ ๋งํ๋ค. -> ๊ทธ๋ผ ๋ถํ ์ ๋ณต ์๋๊ฐ ?
๐ Divide and Conquer ๋ถํ ์ ๋ณต์ด๋ ?
๋ถํ ์ ๋ณต๋ ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋์ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ํฐ ์ฐจ์ด์ ์ด ์๋ค.
๋ถํ ์ ๋ณต์, " ์์ ๋ฌธ์ " ์์ ๋ฐ๋ณต์ด ์ผ์ด๋์ง ์๋๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์, " ์์ ๋ฌธ์ " ์์ ๋ฐ๋ณต์ด ์ผ์ด๋๋ค. -> ๋ถํ์ํ ์ผ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋๋ค.
์ฆ, ๋ถํ ์ ๋ณต์ ์ง์ง ํฐ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ์๊ฒ ์๊ฒ ๋๋ ์ ํธ๋ ๋ฐฉ์์ด๋ผ๋ฉด,
๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์งํผ ๋ฐ๋ณต๋๋ ์์ ๋ฌธ์ ๋ค์ ํ ๊ณณ์ ๋ฌถ์ด ๋๊ฑฐ๋(?) ๊ธฐ๋ก(?) ํ๋ ์์ผ๋ก
๋ถํ์ํ ๋ฐ๋ณต๋ค์ ์ค์ด๋ฉด์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ ๋งํ๋ค.
๐ Memoization ๋ฉ๋ชจ์ด์ ์ด์ ์ด๋ ?
๋์ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ๋ณต๋๋ ์์ ๋ฌธ์ ๋ค์ " ๊ธฐ๋ก " ์ ํตํด ๋ถํ์ํ ๋ฐ๋ณต์ ํด๊ฒฐํ๋ ๋ฐฉ์์ด๋ค.
ํ ๋ฒ ๊ณ์ฐํ ์์ ๋ฌธ์ ์ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ธฐ ํ ๊ณณ์ ์ ์ฅ(๊ธฐ๋ก) ํด๋๋๋ค.
// memoization ์์
function memoization_fib(n){
let memo = [];
memo[0] = 0;
memo[1] = 1;
if(n <= 1) return memo[n];
for(let i=2; i<n; i++){
memo[n] = memo[n-1] + memo[n-2]
}
return memo[n];
}
// f(2) = f(1) + f(0)
// f(3) = f(2) + f(1) = f(1) + f(0) + f(1)
// f(4) = f(3) + f(2) = f(2) + f(1) + f(1) + f(0) = f(1) + f(0) + f(1) + f(1) + f(0)
// -> ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต๋๋ค.
// -> ๊ฐ์ ๋ฌธ์ ๋ ๊ตฌํ ๋๋ง๋ค ์ ๋ต์ด ๊ฐ๋ค.
// ๋ฐ๋ณต๋๋ ๊ฐ๋ค์ ๋ฐฐ์ด์ ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ๊บผ๋ด ์ด๋ค. ^__^
๐ ๊ตฌํ ๋ฐฉ๋ฒ : Bottom-up & Top-down
โพ Bottom-up
// Bottom-up
// ์๋๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ, ๊ฐ์ ๊ตฌํด ๋๊ฐ๋ ๋ฐฉ์์ด๋ค. ์๋ -> ์
// ๋๋ถ๋ถ์ ๋ฐ๋ณต๋ฌธ์ด Bottom-up ๋ฐฉ์์ ํด๋น๋๋ค.
function fibo_bottom_up(n){
if(n <= 1) return n;
let front = 0;
let next = 1;
for(let i=1; i<n; i++){
let sum = front + next;
front = next;
next = sum;
}
return sum;
}
// fibo_bottom_up(6)์ ๊ตฌํ๋ค๊ณ ๊ฐ์ ํ์ ๋,
// i=1, sum=1, front=1, next=1
// i=2, sum=2, front=1, next=2
// i=3, sum=3, front=2, next=3
// i=4, sum=5, front=3, next=5
// i=5, sum=8, front=5, next=8 return๋๋ ๊ฐ์ 8์ด๋ค.
// ์๋๋ถํฐ ์ฐจ๋ก๋๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ์ฌ๋ผ์ค๋ ๊ณผ์ ์ ํ์ธํ ์ ์๋ค.
โพ Top-down
// Top-down
// ํฐ ๋ฌธ์ ๋ฅผ ํ ๋ ์์ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ๊ฐ์ด ๋์จ๋ค๋ ๊ฑธ ์์์ผ ใ
ใ
๊ทธ์ ์์ผ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ด๋ค.
// ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฉ์ ์ ๋ ์๋ X ํ์ํ ์์ ๋ฌธ์ ๋ค๋ง ํด๊ฒฐํ๊ณ ๋ต์ ๋์ถ ! ์ -> ์๋
// ๋๋ถ๋ถ์ ์ฌ๊ท ํจ์๊ฐ Top-down ๋ฐฉ์์ ํด๋น๋๋ค
// fibo_top_down(6)์ ๊ตฌํ๊ธฐ ์ํด fibo_top_down(5)์ fibo_top_down(4)๋ฅผ ๊ตฌํ๊ธฐ ์์ํจ
function fibo_top_down_recur(n){
if(n <= 1) return n;
return fibo_top_down_recur(n-1) + fibo_top_down_recur(n-2);
}
// ์ฐ๋ฆฌ๋ Dynamic Programming ์ ๋ฐฐ์ฐ๊ณ ์์ผ๋,
// ์ด๋ฏธ ๊ตฌํ ๊ฐ์ ๋ ๊ตฌํ๋ ๋ญ๋น๋ ํ์ง ์๋๋ก ์ฝ๋๋ฅผ ์ง์ !~ :)
function fibo_top_down_dp(n){
let memo = [0, 1];
if(n <= 1) return memo[n];
for(let i=2; i<n; i++){
memo[n] = memo[n-1] + memo[n-2]
}
return memo[n];
}
๐ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ ๋ฌธ์ ํ์ด ์์
๋ฐ์ํ
'the others > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Graph - BFS ] ์ธ์ ํ๋ ฌ ๊ธธ ์ฐพ๊ธฐ (0) | 2021.10.13 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋จธ์ค ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ํ์ด (0) | 2021.10.12 |
[ Queue ] ํ๋ฆฐํฐ (0) | 2021.10.09 |
Binary Search Tree ๊ตฌํ : pre-order / in-order / post-order (0) | 2021.09.23 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ถ๋ถ ์งํฉ(๋ฉฑ์งํฉ) ๊ตฌํ๊ธฐ (0) | 2021.09.07 |
๋๊ธ