Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 삼총사 (μ‘°ν•© 풀이과정)

Jieunny 2023. 1. 18. 13:33

πŸ“£  문제 풀이에 μ•žμ„œ JS둜 쑰합을 κ΅¬ν˜„ν•˜λŠ” 과정을 μ•Œμ•„λ³΄μž.

βœ”οΈ μ‘°ν•© : μ„œλ‘œ λ‹€λ₯Έ n개의 λ¬Όκ±΄μ—μ„œ μˆœμ„œλ₯Ό μƒκ°ν•˜μ§€ μ•Šκ³  r개λ₯Ό νƒν•˜λŠ” 것 => nCr

βœ”οΈ κ΅¬ν˜„ κ³Όμ • : λ°°μ—΄μ˜ 처음 μš”μ†ŒλΆ€ν„° ν•˜λ‚˜μ”© κ³ μ •ν•˜κ³ , κ³ μ •λœ μš”μ†Œλ₯Ό μ œμ™Έν•œ μš”μ†Œλ“€ μ€‘μ—μ„œ r-1개λ₯Ό μ‘°ν•©ν•΄μ„œ λΆ™μ΄λŠ” 방법

βœ”οΈ μž¬κ·€μ μœΌλ‘œ ν‘ΈλŠ” 게 μ’‹λ‹€-> 쑰합을 κ΅¬ν•˜λŠ” 과정은 계속 반볡되기 λ•Œλ¬Έμ—!

 

πŸ“Œ 문제

ν•œκ΅­μ€‘ν•™κ΅μ— λ‹€λ‹ˆλŠ” 학생듀은 각자 μ •μˆ˜ 번호λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 학ꡐ 학생 3λͺ…μ˜ μ •μˆ˜ 번호λ₯Ό λ”ν–ˆμ„ λ•Œ 0이 되면 3λͺ…μ˜ 학생은 삼총사라고 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 5λͺ…μ˜ 학생이 있고, 각각의 μ •μˆ˜ λ²ˆν˜Έκ°€ μˆœμ„œλŒ€λ‘œ -2, 3, 0, 2, -5일 λ•Œ, 첫 번째, μ„Έ 번째, λ„€ 번째 ν•™μƒμ˜ μ •μˆ˜ 번호λ₯Ό λ”ν•˜λ©΄ 0μ΄λ―€λ‘œ μ„Έ 학생은 μ‚Όμ΄μ‚¬μž…λ‹ˆλ‹€. λ˜ν•œ, 두 번째, λ„€ 번째, λ‹€μ„― 번째 ν•™μƒμ˜ μ •μˆ˜ 번호λ₯Ό 더해도 0μ΄λ―€λ‘œ μ„Έ 학생도 μ‚Όμ΄μ‚¬μž…λ‹ˆλ‹€. λ”°λΌμ„œ 이 경우 ν•œκ΅­μ€‘ν•™κ΅μ—μ„œλŠ” 두 κ°€μ§€ λ°©λ²•μœΌλ‘œ 삼총사λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œκ΅­μ€‘ν•™κ΅ ν•™μƒλ“€μ˜ 번호λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ λ°°μ—΄ numberκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 학생듀 쀑 삼총사λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λ°©λ²•μ˜ 수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

✏️ 풀이

function solution(number) {
  let noOverlap = [];
  let result = 0;
  
  for(let i=0; i<number.length; i++){
      if(noOverlap.includes(number[i]) === false){
          noOverlap.push(number[i]);
      }
  }
  
  let combinations = getCombinations(number, 3);
  
  for(let i=0; i<combinations.length; i++){
    let sum = 0;
    for(let j=0; j<combinations[i].length; j++){
        sum += combinations[i][j];
    }
    if(sum === 0){
      result++;
    }
  }
  return result;
}

const getCombinations = function (n, r) {
  const results = [];
  if (r === 1){
    return n.map((el) => [el]); 
  }

  n.forEach((fixed, index, origin) => {
    const rest = origin.slice(index + 1); 
    const combinations = getCombinations(rest, r - 1); 
    const attached = combinations.map((el) => [fixed, ...el]); 
    results.push(...attached); 
  });

  return results; 
}

➰ λ°˜λ³΅λ˜λŠ” μˆ˜λŠ” μ—†μ–΄μ•Ό ν•˜λ‹ˆκΉŒ 일단 받은 λ°°μ—΄μ—μ„œ μ€‘λ³΅λ˜λŠ” 숫자 μ œκ±°ν•΄μ„œ noOverlap λ°°μ—΄ λ§Œλ“€μ–΄μ£ΌκΈ°.

➰ noOverlap 배열을 getCombinations() ν•¨μˆ˜ 인자둜 μ€˜μ„œ 3개 μ‘°ν•© κ΅¬ν•˜κΈ°.

➰ κ΅¬ν•œ μ‘°ν•©μ—μ„œ 각각 λ°°μ—΄ μš”μ†Œ λ”ν–ˆμ„ λ•Œ 0 이되면 μ΅œμ’… 닡인 result ++ ν•΄μ£ΌκΈ°.