
- fibonacci
์๋์ ๊ฐ์ด ์ ์๋ ํผ๋ณด๋์น ์์ด ์ค n๋ฒ์งธ ํญ์ ์๋ฅผ ๋ฆฌํดํด์ผ ํฉ๋๋ค.
(๋ฐ๋ณต๋ฌธ ์ฌ์ฉx)
- 0๋ฒ์งธ ํผ๋ณด๋์น ์๋ 0์ด๊ณ , 1๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1์ ๋๋ค.
- ๊ทธ ๋ค์ 2๋ฒ์งธ ํผ๋ณด๋์น ์๋ถํฐ๋ ๋ฐ๋ก ์ง์ ์ ๋ ํผ๋ณด๋์น ์์ ํฉ์ผ๋ก ์ ์ํฉ๋๋ค.
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
7๋ฒ์งธ ํผ๋ณด๋์น ์๊ฐ ๋์ค๋ ๊ณผ์ (n=7)์ ๋์ดํด๋ณด๋ฉด,
0
1
1 = 0 + 1
2 = 1 + 1
3 = 2 + 1
5 = 3 + 2
8 = 5 + 3
13 = 8 + 5
์ด๋ฅผ ํจ์๋ก ํํํด๋ณด๋ฉด
f(n) = f(n-1) + f(n-2)
n>=2์ธ ์์ฐ์, f(0) = 0 , f(1) = 1
์ฆ f(n)์ ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ์์ ์ด n+1 ๊ฐ๋ฅผ ๋ํ๊ฒ ๋๋ ํจ์๊ฐ ๋๋ค.
function fibonacci(n) {
if ( n <= 1 ) {
return n;
}
return fibonacci(n-1) + fibonacci(n-2);
}
์ด๋ ์ฌ๊ทํจ์๋ก ์ฝ๊ฒ ์ ์ํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋์จ๋ค.
์๋๋ฉด fibonacci(7)์ ํ๋ฉด fibonacci(6), fibonacci(5), fibonacci(4)... ์๋ค์ ์ ๋ถ ๊ณ์ฐํ๊ณ , ๋
fibonacci(6)์์ ๋ fibonacci(5), fibonacci(4), fibonacci(3)... ์๊ฐ๋ง ํด๋ ๊ณจ์น์ํ๋ค.
์ฆ Big O์ ์ ๊ณ์๋ฒ์น์ ์ํ์ฌ O(2^n)๋ฒ์ ์คํํ๋ค๋ ๊ฒ. (์ฌ์ค์ n-1)
n>2๋ฅผ ๋์ด๊ฐ๊ฒ ๋๋ฉด, ํ ํจ์์์ ์ฌ๊ท ํธ์ถ์ด ๋ ๋ฒ์ด๋ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. (์๊ฐ๋ณต์ก๋)
๐ซ memoization & ๋ ํผ๋ฐ์คโ๏ธ
์ด๋ฏธ ์ํํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅํด๋๊ณ ๊ฑฐ๊ธฐ์ ๊ฐ์ ๊บผ๋ด์ฐ๋ ๋ฐฉ์์ ์ด์ฉํด๋ณด์. ( memoization ์ค๋ช
์ ์ด ๊ณณ์)
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํ๊ธฐ์, ์ด ๋ถ๋ถ์ด ์ ๋ต์ด์๋ค.
function fibonacci(n) {
const memo = [0, 1]
// ์ฌ๊ท๋ฅผ ์ํ ๋ณด์กฐ ํจ์(auxiliary function -> aux)์ ์ ์ธ)
const aux = (n) => {
// ์ด๋ฏธ ํผ ์ ์ด ์์ผ๋ฉด, ๋ฉ๋ชจํด ๋ ์ ๋ต์ ๋ฆฌํดํ๋ค.
if (memo[n] !== undefined) return memo[n]
// ์๋กญ๊ฒ ํ์ด์ผํ๋ ๊ฒฝ์ฐ, ๋ฌธ์ ๋ฅผ ํ๊ณ ๋ฉ๋ชจ(memo[n])ํด๋๋ค.
memo[n] = aux(n - 1) + aux(n - 2)
return memo[n]
};
return aux(n)
}
๐ซ sliding window
๊ฐ์ด ์ผ์ ํ ๋ฒ์๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ์งํ ์ฑ ์ด๋ํ๋ฉฐ ๊ณ์ฐ๋๋ ๋ฐฉ๋ฒ, ์ต์ํ์ ๋ฐ์ดํฐ๋ง์ ํ์ฉํ๋ ๋ฐฉ๋ฒ (๊ฐ์ฅ ์์ ๊ฒฝ์ฐ์ ์๋ถํฐ ํ๋์ฉ ์ด๋ํ๋ ๋๋์ผ๋ก ๊ณ์ฐ๋ ๊ฐ์ ๋์ ํด๋๊ฐ๋ ๋ฐฉ๋ฒ)
function fibonacci(n) {
let fst = 0, snd = 1
if(n<=1) return n
for (let size = 2; size <= n; size++) {
const next = fst + snd
fst = snd
snd = next
}
return snd
}
๐ซ tabulation
- ์ด๋ค ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์์๋๋ก๊ฐ์ ๊ตฌํด ๋๊ฐ์ผ๋ก์จ ์ค๋ณต๋ ๊ณ์ฐ์ ํ์ง ์๊ณ ๋ค์๊ฐ์ ๋น ๋ฅด๊ฒ ๊ตฌํด๋๊ฐ๋ ๋ฐฉ๋ฒ
- ํ ์ด๋ธ์ ๊ทธ๋ ค๋๊ณ ํ๋์ฉ ์งํํ๋ฉฐ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. ์ ์ผ ์ต์์ ๋จ์๋ถํฐ ๋ฌธ์ ์ ๊ฐ์ ํ ์ด๋ธ์ ์ ์ฅํด ๋๊ฐ๋ฉฐ, ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ ํด๋น ๊ฐ์ ๋ฆฌํด(์ํฅ์)
function fibonacci(n) {
const memo = [0,1]
if (n<=1) return memo[n];
for (let size = 2; size <= n; size++) {
memo[size] = memo[size-1] + memo[size-2]
}
return memo[n]
}
์์ ์ ๋ฐฐ์ ๋ ๋ด์ฉ์ด๊ณ , ๋ ๊ธฐ์ด ์ค์ ๊ธฐ์ด์๋๋ฐ
๋จธ๋ฆฌ๊ฐ ๋ฑ๋ฑํ๊ฒ ๊ตณ์ด์ง ๊ฒ๋ง ๊ฐ์ ๋ณต์ตํ๋ฉด์ ์ฌ๊ทํจ์๋ฅผ ๊ณต๋ถํ๋ค.
์ฌ๊ทํจ์๋ ์ญ์ ๊ทธ๋ฆผ๊ทธ๋ ค๊ฐ๋ฉด์ ํด์ผ ์ ๋ง..
'Algorithm > DailyCoding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[23.02.24] Daily Coding 24 (0) | 2023.05.19 |
---|---|
[23.02.22] Daily Coding 23 (0) | 2023.05.19 |
[23.02.20] Daily Coding 21 (0) | 2023.05.19 |
[22.11.02] Daily Coding 25 (0) | 2023.05.17 |
[22.10.04] Daily Coding 10 (0) | 2023.05.17 |