Algorithm/μΈν”„λŸ°(inflearn)

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] section08 - 12 - μ‘°ν•©μ˜ 경우 수(λ©”λͺ¨μ΄μ œμ΄μ…˜)

YWTechIT 2021. 9. 28. 11:54
728x90

πŸ“ section08 - 12 - μ‘°ν•©μ˜ 경우수 (λ©”λͺ¨μ΄μ œμ΄μ…˜)

λ‹€μŒ 곡식을 μ‚¬μš©ν•˜μ—¬ μž¬κ·€λ₯Ό μ΄μš©ν•΄ μ‘°ν•©μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

 

μ‘°ν•©μ˜ 경우의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œλŠ” n의 λ²”μœ„κ°€ 20정도 λ„˜μœΌλ©΄ λ©”λͺ¨μ΄μ œμ΄μ…˜μœΌλ‘œ ν’€μ–΄μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄ μ—°μ‚° μ‹œκ°„μ΄ 였래 걸리기 λ•Œλ¬Έμ΄λ‹€. λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν•˜λŠ” μ΄μœ λŠ” λ™μΌν•œ 계산을 λ°˜λ³΅ν•˜μ§€ μ•ŠκΈ° μœ„ν•¨μΈλ°, 이전에 ν•œμ°½ 지식인 λ‹΅λ³€ ν™œλ™μ„ ν–ˆμ„ λ•Œ ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ˜ 합계λ₯Ό κ΅¬ν•˜λŠ” μ§ˆλ¬Έμ—μ„œ λ‹΅ν–ˆμ—ˆλ‹€. λ¬Έμ œμ— 주어진 κ³΅μ‹μœΌλ‘œ ν’€ λ•Œ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ μš©ν•˜λŠ” μ΄μœ λ„ λ§ˆμ°¬κ°€μ§€λ‹€.

 

그런데 기쑴에 μ•Œλ˜ 곡식을 μ‚¬μš©ν•΄λ„ λ˜λŠ”λ° μƒˆλ‘œμš΄ 곡식을 μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” 뭘까?(이 곡식을 λ‚˜λŠ” 처음 λ΄€λ‹€ πŸ˜… πŸ˜…) 예λ₯Ό λ“€μ–΄ 5[1, 2, 3, 4, 5]개 쀑 3개λ₯Ό λ½‘λŠ” 경우의 수(5C3)λ₯Ό κ΅¬ν•œλ‹€κ³  ν–ˆμ„ λ•Œ λ‹€μŒκ³Ό 같이 ν’€ 수 μžˆλ‹€.

 

  1. μžμ‹ μ€ ν˜„μž¬ λ½‘λŠ” 값에 ν¬ν•¨ν•˜κ³ , λ‚˜λ¨Έμ§€ κ°’μ—μ„œ r-1개λ₯Ό λ½‘λŠ” 방법(이미 λ‚΄κ°€ λ½‘ν˜”μœΌλ‹ˆ λ‚˜λ¨Έμ§€ 2개λ₯Ό 뽑아야 ν•œλ‹€.)
  2. μžμ‹ μ€ ν˜„μž¬ λ½‘λŠ” 값에 μ œμ™Έμ‹œν‚€κ³ , λ‚˜λ¨Έμ§€ κ°’μ—μ„œ r개λ₯Ό λ½‘λŠ” 방법(λ‚˜λŠ” μ•ˆ λ½‘νžŒλ‹€κ³  κ°€μ •ν•˜κ³  λ‚˜λ¨Έμ§€ κ°’λ“€ μ€‘μ—μ„œ 3개λ₯Ό λ½‘λŠ”λ‹€.)

 

μ΄λ ‡κ²Œ μž¬κ·€μ μœΌλ‘œ μ΄μ–΄λ‚˜κ°€λŠ”λ°, μ’…λ£Œ 쑰건은 n===r || r===0일 λ•Œ 1을 λ¦¬ν„΄ν•œλ‹€. nκ³Ό r이 κ°™λ‹€λ©΄ μˆ«μžμ— 상관없이 1 이고(1C1=1) r이 0이면 1(1C0=1)이기 λ•Œλ¬Έμ΄λ‹€. λ©”λͺ¨μ΄μ œμ΄μ…˜μœΌλ‘œ ν’€ λ•ŒλŠ” 2차원 배열을 μ„ μ–Έν•˜λŠ”λ° λ‹€μŒκ³Ό 같이 μ €μž₯λœλ‹€. (μ½”λ“œμ—μ„œλŠ” memo λ³€μˆ˜μ— ν• λ‹Ή)

 

 

 

문제의 흐름을 그림으둜 κ·Έλ Έλ‹€.

 

 

 

 

728x90

 

 

μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

let n = 5;
let r = 3;

console.log(solution(n, r));

function solution(n, r){
  let answer;
  let memo = Array.from(Array(35), () => Array(35).fill(0));

  function DFS(n, r){ 
    if (memo[n][r]) return memo[n][r];
    if (n === r || r === 0) return 1;
    else return memo[n][r] = DFS(n-1, r-1) + DFS(n-1, r);
  }

  answer = DFS(n, r);
  return answer;
}

 

μ—¬λ‹΄μœΌλ‘œ memoization을 μ‚¬μš©ν–ˆμ„ λ•Œμ™€ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ μ‹€ν–‰μ‹œκ°„μ„ λΉ„κ΅ν–ˆλŠ”λ° memoλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” 0.003초, memoλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•ŒλŠ” 3.3μ΄ˆκ°€ κ±Έλ Έλ‹€.

 

 

 

 

let n = 33;
let r = 19;

// λ©”λͺ¨μ΄μ œμ΄μ…˜ μ‚¬μš© μ½”λ“œ
let memo = Array.from(Array(35), ()=> (Array(35).fill(0)));

function DFS(n, r){
  if (memo[n][r]) return memo[n][r];
  if (n === r || r === 1) return 1;
  else return memo[n][r] = DFS1(n-1, r-1) + DFS1(n-1, r); 
}

console.log(DFS(n,r));
πŸ‘‰πŸ½ 471435600

// λ©”λͺ¨μ΄μ œμ΄μ…˜ λ―Έμ‚¬μš© μ½”λ“œ
function DFS(n, r){
    if (n === r || r === 1) return 1;
    else return DFS(n-1, r-1) + DFS(n-1, r); 
  }

console.log(DFS(n, r));
πŸ‘‰πŸ½ 471435600
λ°˜μ‘ν˜•