๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

23 ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

23 ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Daehyunii 2022. 8. 21. 17:29

23.1 ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ํ•˜์œ„ ๋ฌธ์ œ์˜ ๋ชจ์Œ์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์„ ํ’€์–ด์„œ ๊ทธ ๋‹ต์„ ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ์žˆ์–ด์„œ ์•„์ฃผ ํฐ ์ฐจ์ด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ์˜ ์†๋„๋ฅผ ์ •๋ง ๋งŽ์ด ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

23.2 ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™œ์šฉ ๊ฐ€๋Šฅ ์ƒํ™ฉ

  ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

1) ๋ฐ˜๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€?

2) ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€?

 

  ๋ฐ˜๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ๋ž€ ํ•ด๊ฒฐ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ค‘์ฒฉ๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ๋“ค์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ง์€ ํ•œ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ์กฐ๊ฐ๋“ค ์ค‘ ์ผ๋ถ€๊ฐ€ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ง์ด๋‹ค. ๊ฐ๊ฐ์˜ ์กฐ๊ฐ์ด ๋‹ค๋ฅธ ๋ชจ์Šต์ด๋ฉด ์•ˆ๋˜๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

 

  ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ž€ ํ•˜์œ„ ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๋‹ต์„ ํ†ตํ•ด์„œ ๋” ํฐ ๋ฒ”์ฃผ์˜ ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๋‹ต์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์„œ์šธ์—์„œ ๋ถ€์‚ฐ์„ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ๋ฌธ์ œ๋Š” (์„œ์šธ์—์„œ ์ฒœ์•ˆ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) + (์ฒœ์•ˆ์—์„œ ๋ถ€์‚ฐ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ)๋กœ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ํ•˜์œ„ ๋ฌธ์ œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋“ค์˜ ํ•ฉ์ด (์„œ์šธ์—์„œ ๋ถ€์‚ฐ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ)๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

23.3 ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

  ์ผ๋ฐ˜ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

 

โ—Žํ”ผ๋ณด๋‚˜์น˜ ๊ณต์‹ 

1) fib(n) = fib(n-1) + fib(n-2)

2) fib(2) = 1

3) fib(1) = 1

์˜ˆ๋ฅผ๋“ค์–ด fib(20)์€ 20๋ฒˆ์งธ ์ˆซ์ž์˜ ๊ฐ’์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

fib(6)์€ ์ˆซ์ž 8์„ ์˜๋ฏธํ•œ๋‹ค.(1 + 1 + 2 + 3 + 5 + 8)

// ์ผ๋ฐ˜ ์žฌ๊ท€ ๋ฐฉ์‹์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
function fib(n){
    if(n <= 2) return 1;
    return fib(n-1) + fib(n-2);
}

  ์œ„์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, O(2^N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์กฐ๊ธˆ๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์˜ ํด์ˆ˜๋ก ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋งค์šฐ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

(ex fib(5) = fib(4) + fib(3) = fib(3) + fib(2) + fib(2) + fib(1))

 

23.4 Memo์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•(Memoization)

  ์œ„์˜ ์ผ๋ฐ˜ ์žฌ๊ท€ ๋ฐฉ์‹์˜ ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜์˜จ ๊ฐ’๋“ค์„ ๊ธฐ์–ตํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด fib(5)๋ฅผ ๊ตฌํ• ๋•Œ๋Š” fib(3)์˜ ๊ณ„์‚ฐ์ด ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ฒ˜์Œ fib(3)์„ ๊ณ„์‚ฐํ–ˆ์„๋•Œ ์ด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋‹ค์‹œ fib(3)์„ ๊ณ„์‚ฐํ•ด์•ผํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋†“์€ fib(3)์˜ ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ต์‹ฌ์€ ๋ณดํ†ต ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ €์žฅํ•ด ๋†“์€ ๊ฐ’๋“ค์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

function fib(n, memo=[]){
  if(memo[n] !== undefined) return memo[n]
  if(n <= 2) return 1;
  var res = fib(n-1, memo) + fib(n-2, memo);
  memo[n] = res;
  return res;
}

23.5 Memoization์„ ํ™œ์šฉํ•ด์„œ ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ์˜ ๋น…์˜ค ์‹œ๊ฐ„ ๋ณต์žก๋„

1) ์ผ๋ฐ˜ ์žฌ๊ท€ํ˜• ํ”ผ๋ณด๋‚˜์น˜ : O(2^N)

2) ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•œ ํ”ผ๋ณด๋‚˜์น˜ : O(N)

 

23.6 Tabulation

  ํƒ€๋ทธ๋ ˆ์ด์…˜์€ ๋ฃจํ”„์™€ ๊ฐ™์ด ์ˆœํ™˜์„ ํ†ตํ•ด ์ž‘์—…ํ•œ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ๊ฐ€์žฅ ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ํ‘ผ ๋‹ค์Œ์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ฆ‰, ๊ฐ€์žฅ ๋ฐ”๋‹ฅ์— ์œ„์น˜ํ•œ fib(1)๋ถ€ํ„ฐ ๊ณ„์‚ฐ์„ ํ•˜๋ฉด์„œ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

function fib(n){
    if(n <= 2) return 1;
    var fibNums = [0,1,1];
    for(var i = 3; i <= n; i++){
        fibNums[i] = fibNums[i-1] + fibNums[i-2];
    }
    return fibNums[n];
}

 

 

 

'๐Ÿ“š Language & CS knowledge > Algorithm & Data structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

21 ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ  (0) 2022.08.19
20 ๊ทธ๋ž˜ํ”„  (0) 2022.08.17
19 ํ•ด์‹œ ํ…Œ์ด๋ธ”  (0) 2022.08.16
18 ์ด์ง„ ํž™  (0) 2022.08.16
17 ํŠธ๋ฆฌ ์ˆœํšŒ  (0) 2022.08.16