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

[JavaScript/section 8] 10 - μˆœμ—΄ κ΅¬ν•˜κΈ°

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

πŸ“Œ 10 - μˆœμ—΄ κ΅¬ν•˜κΈ°

10μ΄ν•˜μ˜ N개의 μžμ—°μˆ˜κ°€ 주어지면 이 쀑 M개λ₯Ό 뽑아 일렬둜 λ‚˜μ—΄ν•˜λŠ” 방법을 λͺ¨λ‘ 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

μ€‘λ³΅μˆœμ—΄ κ΅¬ν•˜κΈ° λ¬Έμ œμ™€ λ‹€λ₯Έ 점은 쀑볡없이 μˆœμ„œμ— μƒκ΄€μžˆκ²Œ μ„ νƒν•œλ‹€λŠ” 점이닀.  λ§Œμ•½ 3개의 μžμ—°μˆ˜κ°€ 주어지고 이 쀑 2개λ₯Ό 뽑아 일렬둜 λ‚˜μ—΄ν•˜λŠ” 방법은 λ‹€μŒ κ·Έλ¦Όκ³Ό 같이 총 6가지이닀.

 

πŸ‘ 풀이 방법

ch 배열은 tmp 배열에 μ–΄λ–€ μˆ˜κ°€ μ„ νƒλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ 배열이닀. (쀑볡 검증)

  • ch[i]의 값이 0이면 μ„ νƒλ˜μ§€ μ•Šμ•˜λ‹€λŠ” κ²ƒμ΄λ―€λ‘œ 선택해도 λœλ‹€λŠ” μ˜λ―Έμ΄λ‹€. λ°˜λŒ€λ‘œ ch[i]의 값이 1이면 이미 μ„ νƒλ˜μ—ˆλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ κ±΄λ„ˆλ›΄λ‹€.
  • L(트리의 레벨)이 mκ³Ό κ°™λ‹€λ©΄ ν•˜λ‚˜μ˜ κ²½μš°κ°€ μ™„μ„±λœ κ²ƒμ΄λ―€λ‘œ tmp 배열을 얕은 λ³΅μ‚¬ν•˜μ—¬ answer 배열에 μΆ”κ°€ν•œλ‹€.
  • DFS ν•¨μˆ˜μ˜ 호좜이 λλ‚œ λ‹€μŒμ—” ch[i](이전에 μ„ νƒν•œ 숫자)λ₯Ό 0으둜 μž¬ν• λ‹Ή ν•΄μ•Όν•œλ‹€.

그림으둜 κ·Έλ €λ³΄λŠ” 것이 μ΄ν•΄ν•˜λŠ”λ° 도움이 될 것이라고 μƒκ°ν•œλ‹€.

function solution(m, arr) {
  const answer = [];
  const n = arr.length;
  const ch = Array.from({ length: n }, () => 0);
  const tmp = Array.from({ length: m }, () => 0);

  function DFS(L) {
    if (L === m) {
      answer.push(tmp.slice());
    } else {
      for (let i = 0; i < n; i++) {
        if (ch[i] === 0) {
          ch[i] = 1;
          tmp[L] = arr[i];
          DFS(L + 1);
          ch[i] = 0;
        }
      }
    }
  }
  DFS(0);

  for (let [a, b] of answer) {
    console.log(a, b);
  }

  return answer.length;
}

let arr = [3, 6, 9];
console.log(solution(2, arr));

 

πŸ“ ν•œ λ§ˆλ”” 남기며..

μ΄ν•΄ν•˜λŠ”λ° μ–΄λ €μšΈ 수 μžˆλŠ” 문제라고 μƒκ°ν•©λ‹ˆλ‹€. μ½”λ“œλ₯Ό 따라가며 그림으둜 κ·Έλ €λ³΄λŠ” 것이 μ΄ν•΄ν•˜λŠ”λ° 도움이 될 수 μžˆμ§€λ§Œ κ·Έλž˜λ„ μ–΄λ ΅λ‹€λŠ” 생각이 λ“ λ‹€λ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”~ 쒋은 ν•˜λ£¨ λ˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€πŸ˜Š