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

[JavaScript/section 10] 01 - κ³„λ‹¨μ˜€λ₯΄κΈ°

_μ„±ν˜Έ_ 2022. 12. 17. 14:34
728x90
λ°˜μ‘ν˜•

πŸ“Œ 01 - κ³„λ‹¨μ˜€λ₯΄κΈ°(동적 κ³„νšλ²•)

μ² μˆ˜λŠ” 계단을 였λ₯Ό λ•Œ ν•œ λ²ˆμ— ν•œ 계단 λ˜λŠ” 두 계단씩 μ˜¬λΌκ°„λ‹€. λ§Œμ•½ 총 4계단을 였λ₯Έλ‹€λ©΄ κ·Έ λ°©λ²•μ˜ μˆ˜λŠ” 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2둜 5가지이닀.

κ·Έλ ‡λ‹€λ©΄ 총 N계단일 λ•Œ μ² μˆ˜κ°€ 올라갈 수 μžˆλŠ” λ°©λ²•μ˜ μˆ˜λŠ” λͺ‡ 가지인가?

 

πŸ“ 풀이 방법(DFS, DP)

DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν’€μ–΄λ³΄μ•˜λ‹€. 정닡은 ν›Œλ₯­ν•˜κ²Œλ„ 잘 λ‚˜μ˜¨λ‹€ πŸ‘

ν•˜μ§€λ§Œ n의 값이 컀진닀면...❓ μ—°μ‚° νšŸμˆ˜κ°€ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λœλ‹€.

이λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” λ°©λ²•μœΌλ‘œ 동적 κ³„νšλ²•(dynamic programming, DP)이 μ‘΄μž¬ν•œλ‹€.

function solution(n) {
  let answer = 0;

  function DFS(sum) {
    if (sum > n) return;
    if (sum === n) answer++;
    else {
      for (let i = 1; i <= 2; i++) {
        DFS(sum + i);
      }
    }
  }

  DFS(0);
  return answer;
}

console.log(solution(7));

 

동적 κ³„νšλ²•(dynamic programming, DP)

μ–΄λ–€ 문제λ₯Ό ν’€κΈ° μœ„ν•΄ κ·Έ 문제λ₯Ό 더 μž‘μ€ 문제의 μ—°μž₯μ„ μœΌλ‘œ μƒκ°ν•˜κ³ , 과거에 κ΅¬ν•œ ν•΄λ₯Ό ν™œμš©ν•˜λŠ” λ°©μ‹μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

주어진 λΆ€λΆ„ 문제의 정닡을 ν•œ 번만 κ³„μ‚°ν•˜κ³  μ €μž₯(λ©”λͺ¨)ν•΄λ‘” λ’€ λ‹€μ‹œ ν•œ 번 이 λΆ€λΆ„ 문제λ₯Ό μ΄μš©ν•  λ•Œμ—λŠ” μ €μž₯ν•΄λ‘” 정닡을 λ°”λ‘œ μ‚°μΆœν•˜μ—¬ μ΄μš©ν•¨μœΌλ‘œμ¨ 속도λ₯Ό ν–₯μƒμ‹œν‚¨λ‹€β—

  • 총 7계단을 였λ₯΄κΈ° μœ„ν•œ 문제λ₯Ό 더 μž‘μ€ 문제둜 λ‚˜λˆ„μ–΄ 1계단과 2계단을 였λ₯΄κΈ° μœ„ν•œ 경우의 수λ₯Ό λ¨Όμ € κ΅¬ν•œλ‹€.
  • 3계단을 였λ₯΄κΈ° μœ„ν•΄μ„œλŠ” 1κ³„λ‹¨μ—μ„œ 두 계단을 였λ₯΄λ˜μ§€ 2κ³„λ‹¨μ—μ„œ ν•œ 계단을 였λ₯΄λ©΄ λœλ‹€.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 3계단을 였λ₯΄κΈ° μœ„ν•œ 경우의 μˆ˜λŠ” 1계단을 였λ₯΄κΈ° μœ„ν•œ 경우의 μˆ˜μ™€ 2계단λ₯Ό 였λ₯΄κΈ° μœ„ν•œ 경우의 수λ₯Ό 더해주면 λœλ‹€. 
  • λ‹€μŒκ³Ό 같이 dy[i] = dy[i-2] + dy[i-1] 와 같은 관계식을 λ§Œλ“€ 수 μžˆλ‹€.
  • 결둠적으둜 dy[3]을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ dy[1]κ³Ό dy[2]λ₯Ό 이전에 연산을 해두고 μ €μž₯ν•΄λ‘” λ°°μ—΄μ—μ„œ μ‚°μΆœν•˜μ—¬ μ΄μš©ν•¨μœΌλ‘œμ¨ μ—°μ‚° 속도λ₯Ό ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
function solution(n) {
  let answer = 0;
  let dy = Array.from({ length: n + 1 }, () => 0);

  dy[1] = 1;
  dy[2] = 2;
  for (let i = 3; i <= n; i++) {
    dy[i] = dy[i - 2] + dy[i - 1];
  }
  answer = dy[7];

  return answer;
}

console.log(solution(7));

 

πŸ’» μ°Έκ³  μ‚¬μ΄νŠΈ

 

동적 κ³„νšλ²• - λ‚˜λ¬΄μœ„ν‚€

동적 κ³„νšλ²•μ˜ κ°œλ…κ³Ό κ΅¬ν˜„μ— λŒ€ν•΄ μ •ν™•ν•˜κ²Œ 짚고 λ„˜μ–΄κ°€κΈ° μœ„ν•΄ 동적 κ³„νšλ²•μ„ μ μš©μ‹œν‚¬ 수 μžˆλŠ” μ˜ˆμ— λŒ€ν•΄ μ•Œμ•„λ³΄μž. f(a,b) = f(a-1,b) + f(a,b-1) (a,b >= 1 )f(0,0) = 1, μž„μ˜μ˜ μžμ—°μˆ˜ n에 λŒ€ν•΄ f(n,0) = f(0,

namu.wiki