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

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] section08 - 7 - μ΅œλŒ€μ μˆ˜ κ΅¬ν•˜κΈ°(DFS)

YWTechIT 2021. 9. 23. 11:20
728x90

πŸ“ section08 - 7 - μ΅œλŒ€μ μˆ˜ κ΅¬ν•˜κΈ°(DFS)

μ œν•œμ‹œκ°„ Mμ•ˆμ— N개의 문제 쀑 μ΅œλŒ€μ μˆ˜λ₯Ό 얻을 수 μžˆλ„λ‘ κ΅¬ν•˜λŠ” λ¬Έμ œλ‹€. 처음 문제λ₯Ό 봀을 λ•Œ νšŒμ˜μ‹€ λ°°μ •λ¬Έμ œμ™€ λΉ„μŠ·ν•œ 쀄 μ•Œμ•˜λŠ”λ°, κ·Έλ¦¬λ””λ‘œλŠ” ν’€ 수 μ—†μ—ˆλ‹€. 점수λ₯Ό 높은 순으둜 μ •λ ¬(sort)ν•œ λ‹€μŒ μˆœμ„œλŒ€λ‘œ ν’€λ©΄ 제 ν•œ μ‹œκ°„ μ•ˆμ— μ΅œλŒ€ 점수λ₯Ό 얻을 수 μžˆμ§€ μ•Šλ‚˜?라고 μƒκ°ν–ˆλŠ”λ° 그것보닀, λͺ¨λ“  경우의 수(뢀뢄집합)λ₯Ό κ΅¬ν•΄μ„œ M보닀 μž‘μœΌλ©΄μ„œ λ™μ‹œμ— μ΅œλŒ€ 점수λ₯Ό κ°±μ‹ ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€.

 

μ—¬κΈ°μ„œ λͺ¨λ“  경우의 수λ₯Ό κ΅¬ν•˜μ§€ μ•Šκ³  edgeCut(κ°€μ§€μΉ˜κΈ°)을 μ΄μš©ν–ˆλŠ”λ° ν˜„μž¬κΉŒμ§€ λˆ„μ λœ μ‹œκ°„μ΄ M보닀 크닀면 더 이상 계산 ν•  ν•„μš” 없이 returnν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆλ‹€. μ’…λ£Œ 쑰건은 L===n인데, λ¬Έμ œλŠ” ν•œ μœ ν˜•λ‹Ή ν•œ κ°œμ”©λ§Œ ν’€ 수 있기 λ•Œλ¬Έμ— ν•˜λ‚˜μ”© λͺ¨λ‘ μ‚¬μš©ν–ˆμ„ λ•Œ μ΅œλŒ€ L(level)은 N이 λ˜κΈ°λ•Œλ¬Έμ΄λ‹€. ν•˜λ‹¨μ˜ DFS의 그림을 μ°Έκ³ ν•˜μž. λͺ¨λ“  경우의 수λ₯Ό 그리진 μ•Šκ³ , μ΄λ ‡κ²Œ λ¬Έμ œμ™€ 점수λ₯Ό λˆ„μ ν•΄κ°„λ‹€λŠ” 것을 ν‘œν˜„ν–ˆλ‹€.

 

 

 

728x90

 

let n = 5;
let m = 20;
let arr = [[10, 5], [25, 12], [15, 8], [6, 3], [7, 4]];

console.log(solution(n, m, arr));

function solution(n, m, arr){
  let answer=Number.MIN_SAFE_INTEGER;

  function DFS(L, sum, time){
    if (time > m) return;
    if (L === n){
      answer = Math.max(answer, sum);
    }else{
      DFS(L+1, sum+arr[L][0], time+arr[L][1]);
      DFS(L+1, sum, time);
    }
  }
  DFS(0, 0, 0);
  return answer;
}
λ°˜μ‘ν˜•