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

[JavaScript/section 8] 09 - λ™μ „κ΅ν™˜

_μ„±ν˜Έ_ 2022. 11. 5. 14:06
728x90
λ°˜μ‘ν˜•

πŸ“Œ 09 - λ™μ „κ΅ν™˜(DFS)

μ—¬λŸ¬ λ‹¨μœ„μ˜ 동전듀이 μ£Όμ–΄μ Έ μžˆμ„λ•Œ κ±°μŠ€λ¦„λˆμ„ κ°€μž₯ 적은 수의 λ™μ „μœΌλ‘œ κ΅ν™˜ν•΄μ£Όλ €κ³  ν•œλ‹€. μ΄λ•Œ λ™μ „μ˜ μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 각 λ‹¨μœ„μ˜ 동전은 λ¬΄ν•œμ • μ“Έ 수 μžˆλ‹€.

μž…λ ₯예제
1 2 5
15
좜λ ₯예제
3

μ„€λͺ…: 5 5 5 동전 3개둜 거슬러 쀄 수 μžˆλ‹€.

 

πŸ‘ 풀이 방법

μ€‘λ³΅μˆœμ—΄ κ΅¬ν•˜κΈ° 문제λ₯Ό λ¨Όμ € μ΄ν•΄ν•˜κ³  μ˜¨λ‹€λ©΄ 어렡지 μ•Šκ²Œ 이번 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ„ 것이닀. 단, μ΄λ²ˆμ—λŠ” ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œμΌœμ•Ό ν•˜λŠ” μ‹œμ μ„ 잘 생각해봐야 ν•œλ‹€. λΆˆν•„μš”ν•œ νƒμƒ‰κΉŒμ§€ ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

  • λ™μ „μ˜ μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ―€λ‘œ answer(κ·Έ μ‹œμ μ— λ™μ „μ˜ μ΅œμ†Œ 개수)보닀 L(레벨, λ™μ „μ˜ 개수)이 ν¬κ±°λ‚˜ κ°™λ‹€λ©΄ 더 이상 깊이 탐색할 ν•„μš” 없이 return ν•œλ‹€.
  • sum(λ™μ „μ˜ ν•©)이 m(κ±°μŠ€λ¦„λˆ)을 μ΄ˆκ³Όν•œλ‹€λ©΄ return ν•œλ‹€.
function solution(m, arr) {
  let answer = Number.MAX_SAFE_INTEGER;
  let n = arr.length;
  let arrCopy = Array.from(arr).sort((a, b) => b - a);

  function DFS(L, sum) {
    if (answer <= L) return;
    if (sum > m) return;
    if (sum === m) {
      answer = Math.min(answer, L);
      return;
    } else {
      for (let i = 0; i < n; i++) {
        DFS(L + 1, sum + arrCopy[i]);
      }
    }
  }
  DFS(0, 0);
  return answer;
}

let arr = [1, 2];
console.log(solution(4, arr));