Bibi's DevLog ๐Ÿค“๐ŸŽ

[์ธํ”„๋Ÿฐ] Javascript - ์žฌ๊ท€์˜ ๊ธฐ์ดˆ2 (์ ํ™”์‹, ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด, ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ memoization) ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Javascript ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

[์ธํ”„๋Ÿฐ] Javascript - ์žฌ๊ท€์˜ ๊ธฐ์ดˆ2 (์ ํ™”์‹, ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด, ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ memoization)

๋น„๋น„ bibi 2020. 11. 1. 20:34
* ์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜ธ๋ˆ…์Šค๋‹˜์˜ ์œ ๋ฃŒ ๊ฐ•์˜ '์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Javascript ์ž…๋ฌธ - ์ฝ”๋“œ์Šค์ฟผ๋“œ ๋งˆ์Šคํ„ฐ์ฆˆ ์ฝ”์Šค ๋ ˆ๋ฒจ1'๋ฅผ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๊ฐ•์˜ ๋‚ด์šฉ์— ๋”ํ•ด, ์ œ๊ฐ€ ํ•„๊ธฐํ•˜๊ณ  ๊ตฌ๊ธ€๋งํ•œ ๋‚ด์šฉ์ด ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ธ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€์ •ํ™•ํ•œ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๊ฐ์•ˆํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ธํ”„๋Ÿฐ ์ธก ๋‹ต๋ณ€์„ ๋ฐ›์€ ์ ์ด ์žˆ์œผ๋‚˜(https://bibi6666667.tistory.com/37), ์ €์ž‘๊ถŒ์ƒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ณดํ˜ธ ๋ชจ๋“œ(๋น„๊ณต๊ฐœ)๋กœ ์ „ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ ํ™”์‹

์žฌ๊ท€๋‚˜ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ๊ฑธ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜ํ•™ ๊ณต์‹์ž…๋‹ˆ๋‹ค.

(๊ตฌ๊ธ€๋ง) ์ ํ™”์‹ (= ์žฌ๊ท€์‹, recurrence relation)
: (์ˆ˜ํ•™)์ˆ˜์—ด์—์„œ ์ด์›ƒํ•˜๋Š” ๋‘๊ฐœ์˜ ํ•ญ ์‚ฌ์ด์— ์„ฑ๋ฆฝํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ด€๊ณ„์‹์ด๋‹ค.


 

์žฌ๊ท€๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ตฌํ˜„ํ•˜๊ธฐ

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋ž€ ์˜ค๋ž˜ ๋œ ์ˆ˜ํ•™ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฌด์ธ๋„ ํ† ๋ผ ๋ฌธ์ œ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

m.blog.naver.com/PostView.nhn?blogId=brain_m&logNo=221100195745&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[์‹ ๊ธฐํ•œ ์ˆ˜์—ด ์ด์•ผ๊ธฐ]ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด/๋ ˆ์˜ค๋‚˜๋ฅด๋„ํ”ผ๋ณด๋‚˜์น˜/ํ† ๋ผ์ˆ˜์—ด/์ž์—ฐ์†ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ธŒ๋ ˆ์ธ๋งค์“ฐ์ž…๋‹ˆ๋‹ค ๋“ฑ๋น„์ˆ˜์—ด, ๋“ฑ์ฐจ์ˆ˜์—ด, ๋ฌดํ•œ์ˆ˜์—ด, ๊ฐœ๋ฏธ์ˆ˜์—ด ... ๋‹ค์–‘ํ•œ ์ˆ˜์—ด๋“ค ์ค‘์—์„œ ์˜ค๋Š˜์€ ...

blog.naver.com

 

โ€ป ์•„๊ธฐ ํ† ๋ผ๋Š” ๋‹ค ์ž๋ผ๋Š” ๋ฐ ํ•œ ๋‹ฌ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋‹ค ์ž๋ž€ ํ† ๋ผ๋Š” ์•„๊ธฐ ํ† ๋ผ๋ฅผ ํ•œ ์Œ ๋‚ณ๋Š”๋‹ค.
ํ† ๋ผ๋Š” ๋Š™์ง€ ์•Š๊ณ  ์˜์›ํžˆ ์•„๊ธฐ ํ† ๋ผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ๋ฌด์ธ๋„์— ์•„๊ธฐ ํ† ๋ผ๊ฐ€ ํ•œ ์Œ ๋“ค์–ด์˜จ๋‹ค.
ํ•œ ๋‹ฌ ๋’ค) ์–ด๋ฅธ ํ† ๋ผ ํ•œ ์Œ์ด ์•„๊ธฐ ํ† ๋ผ ํ•œ ์Œ์„ ๋‚ณ๋Š”๋‹ค.
๋‘ ๋‹ฌ ๋’ค) ์–ด๋ฅธ ํ† ๋ผ ๋‘ ์Œ์ด ๊ฐ๊ฐ ์•„๊ธฐ ํ† ๋ผ ํ•œ ์Œ์„ ๋‚ณ๋Š”๋‹ค.

.. n๊ฐœ์›” ๋’ค์— ํ† ๋ผ๋Š” ์ด ๋ช‡ ์Œ์ด ์žˆ์„๊นŒ?

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์ ํ™”์‹

f(0) = 0,  > ์ฒ˜์Œ : 0์Œ.
f(1) = 1,  > ์ฒซ์งธ ๋‹ฌ : (์•„๊ธฐํ† ๋ผ) 1์Œ
f(2) = f(1) + f(0)= 1 + 0 = 1 > ๋‘˜์งธ ๋‹ฌ : ์–ด๋ฅธํ† ๋ผ 1์Œ
f(3) = f(2) + f(1) = 1 + 1 = 2 > ์…‹์งธ ๋‹ฌ : ์–ด๋ฅธํ† ๋ผ 1์Œ, (์•„๊ธฐํ† ๋ผ) 1์Œ = 2์Œ
f(4) = f(3) + f(2) = 2 + 1 = 3 > ๋„ท์งธ ๋‹ฌ : ์–ด๋ฅธํ† ๋ผ 2์Œ, (์•„๊ธฐํ† ๋ผ) 1์Œ = 3์Œ
f(5) = f(4) + f(3) = 3 + 2 = 5 > ๋‹ค์„ฏ์งธ ๋‹ฌ : ์–ด๋ฅธํ† ๋ผ 3์Œ, (์•„๊ธฐํ† ๋ผ) 2์Œ = 5์Œ
...
์ •๋ฆฌํ•˜๋ฉด
f(0) = 0  > ์ฒ˜์Œ : 0์Œ
f(1) = 1  > ์ฒซ์งธ ๋‹ฌ : (์•„๊ธฐํ† ๋ผ) 1์Œ
...
f(n) = f(n-1) + f(n-2)  > n์งธ ๋‹ฌ = n-1๋ฒˆ์งธ ๋‹ฌ์˜ ํ† ๋ผ ์ˆ˜ + n-2๋ฒˆ์งธ ๋‹ฌ์˜ ํ† ๋ผ ์ˆ˜

 


 

์žฌ๊ท€๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ˜„ํ•˜๊ธฐ

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

 var fibo = function (n) { // n๊ฐœ๋ญ˜ ํ›„ ํ† ๋ผ ์Œ์˜ ์ˆ˜.
        if (n == 0) { //n์ด 0์ด๋ฉด 0.
            return 0;
        } else if (n == 1) {
            return 1;
        } else {
            return fibo(n - 1) + fibo(n - 2);
        }
    }
    fibo(0); // 0
    fibo(1); // 1
    fibo(2); // 1
    fibo(3); // 2
    fibo(4); // 3
    fibo(5); // 5
    fibo(6); // 8

 

๊ทธ๋Ÿฌ๋‚˜ ์œ„ ์ฝ”๋“œ์˜ ์น˜๋ช…์  ๋ฌธ์ œ๋Š”..
: ๋งค๋ฒˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ™์€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค (์ด๋ฏธ ๊ณ„์‚ฐํ•ด์„œ ์•„๋Š” ๊ฐ’์ธ๋ฐ๋„).
( = ํ•จ์ˆ˜๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์ด ํ˜ธ์ถœํ•œ๋‹ค)
์™œ? ์ปดํ“จํ„ฐ๋Š” '์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ’์ด๋ผ๋Š” ์‚ฌ์‹ค ์ž์ฒด๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—' ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋˜‘๊ฐ™์€ ๊ณ„์‚ฐ์„ ๋˜ ํ•˜๋Š” ๊ฒƒ.

fibo(40); ๋งŒ ํ•ด ๋ณด์•„๋„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์ด ์กฐ๊ธˆ์”ฉ ๋Š๋ ค์ง์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
(fibo(40)์„ ์œ„ํ•ด ์ปดํ“จํ„ฐ๋Š” ๋ช‡์–ต ๋ฒˆ๋„ ๋„˜๊ฒŒ ๊ณ„์‚ฐ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋–„๋ฌธ)

์˜ˆ๋ฅผ ๋“ค์–ด fibo(10) ์ด๋ผ๊ณ  ํ•ด ๋ณด๋ฉด..
fibo(10) = fibo(9) + fibo(8)
1. fibo(9)๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(9) = fibo(8) + fibo(7), 
->fibo(8)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(8) = fibo(7) + fibo(6)์„ ๊ตฌํ•˜๊ณ 
->fibo(7)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(7) = fibo(6) + fibo(5)๋ฅผ ๊ตฌํ•œ๋‹ค.
๊ตฌํ–ˆ๋˜ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐ.
2. fibo(8)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(8) = fibo(7) + fibo(6),
->fibo(7)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(7) = fibo(6) + fibo(5)๋ฅผ ๊ตฌํ•œ๋‹ค.
->fibo(6)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo(6) = fibo(5) + fibo(4)๋ฅผ ๊ตฌํ•œ๋‹ค.
์—ญ์‹œ ๊ตฌํ–ˆ๋˜ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐ.

 

๋Œ€์•ˆ : ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ• (์˜ต์…˜)

var arr =[0, 1]; 

function fibo_d(n) {
    if(arr[n] == undefined) {
        arr[n] = fibo_d(n - 1) + fibo_d(n - 2);
    }
    return arr[n];
} 


์ด๋Ÿฐ ๋ฐฉ๋ฒ•์„ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋˜๋Š” memoization๋ฉ”๋ชจ์ด์ œ์ด์…˜) ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
-> ์ฝ”๋“œ ์„ค๋ช…์€ ์ƒ๋žต. ์ง€๊ธˆ์€ ๊ทธ๋ƒฅ ์ด๋Ÿฐ ๊ฐœ๋…์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ. (์–ด์ฐจํ”ผ ์ง€๊ธˆ ์ˆ˜์ค€์—์„œ ์„ค๋ช… ๋ถˆ๊ฐ€๋Šฅ..)
(๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฌ˜๋ฏธ์ด๋‹ค)