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

[JavaScript/section 1] 08 - 일곱 λ‚œμŸμ΄

_μ„±ν˜Έ_ 2022. 9. 1. 13:21
728x90
λ°˜μ‘ν˜•

πŸ“Œ 문제

μ™•λΉ„λ₯Ό ν”Όν•΄ 일곱 λ‚œμŸμ΄λ“€κ³Ό ν•¨κ»˜ ν‰ν™”λ‘­κ²Œ μƒν™œν•˜κ³  있던 λ°±μ„€κ³΅μ£Όμ—κ²Œ μœ„κΈ°κ°€ μ°Ύμ•„μ™”λ‹€. 일과λ₯Ό 마치고 λŒμ•„μ˜¨ λ‚œμŸμ΄κ°€ 일곱 λͺ…이 μ•„λ‹Œ 아홉 λͺ…μ΄μ—ˆλ˜ 것이닀. 아홉 λͺ…μ˜ λ‚œμŸμ΄λŠ” λͺ¨λ‘ μžμ‹ μ΄ "λ°±μ„€ 곡주와 일곱 λ‚œμŸμ΄"의 주인곡이라고 μ£Όμž₯ν–ˆλ‹€. λ›°μ–΄λ‚œ μˆ˜ν•™μ  직관λ ₯을 κ°€μ§€κ³  있던 λ°±μ„€κ³΅μ£ΌλŠ”, 일곱 λ‚œμŸμ΄μ˜ ν‚€μ˜ 합이 100이 됨을 κΈ°μ–΅ν•΄ λƒˆλ‹€.

아홉 λ‚œμŸμ΄μ˜ ν‚€κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 백섀곡주λ₯Ό 도와 일곱 λ‚œμŸμ΄λ₯Ό μ°ΎλŠ” λ¬Έμ œμ΄λ‹€.

 

이쀑 for문을 μ‚¬μš©ν•˜μ—¬ 2개의 μžμ—°μˆ˜λ₯Ό 뽑은 ν›„ 9개의 μžμ—°μˆ˜ ν•©(sum)μ—μ„œ λΊ€ 값이 100이 λ˜μ–΄μ•Ό ν•œλ‹€.

κ°•μ˜λŒ€λ‘œ splice() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄λ„ λ˜μ§€λ§Œ filter() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ” μ›μ†Œλ“€λ‘œ μƒˆλ‘œμš΄ 배열을 생성해 λ°˜ν™˜ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œλ„ ν’€ 수 μžˆλ‹€. 

 

πŸ“ 풀이

// splice() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ μ½”λ“œ
function solution(arr) {
  let answer = arr;
  let sum = answer.reduce((a, b) => a + b, 0);

  for (let i = 0; i < 8; i++) {
    for (let j = i + 1; j < 9; j++) {
      if (sum - (answer[i] + answer[j]) === 100) {
        // iλ₯Ό λ¨Όμ € μ œκ±°ν•˜λ©΄ 뒀에 값듀이 μ•žμœΌλ‘œ λ‹Ήκ²¨μ§€λ©΄μ„œ answer[j]의 값이 λ³€κ²½ λŒβ— 
        answer.splice(j, 1);  
        answer.splice(i, 1);
      }
    }
  }

  return answer;
}

let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));
// filter() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ μ½”λ“œ
function solution(arr) {
  let answer;
  let sum = arr.reduce((sum, v) => sum + v, 0);

  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (sum - (arr[i] + arr[j]) === 100) {
        answer = arr.filter((v, idx) => {
          if (idx === i || idx === j) return false;
          else return true;
        });

        break;
      }
    }
  }

  return answer;
}

let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));

 

πŸ’‘ Array.prototype.splice()

λ°°μ—΄μ˜ κΈ°μ‘΄ μš”μ†Œλ₯Ό μ‚­μ œ λ˜λŠ” κ΅μ²΄ν•˜κ±°λ‚˜ μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜μ—¬ λ°°μ—΄μ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

πŸ‘‰ μƒˆλ‘œμš΄ 배열을 생성해 λ°˜ν™˜ν•˜λŠ” 것이 μ•„λ‹Œ λ°°μ—΄μ˜ κΈ°μ‘΄ μš”μ†Œλ₯Ό λ³€κ²½ ❗

const days = ['Mon', 'Wed', 'Thu', 'Fri'];
days.splice(1, 0, 'Tue');
// inserts at index 1
console.log(days);
// expected output: Array ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']

1️⃣ 번째 인자 - λ°°μ—΄μ˜ 변경을 μ‹œμž‘ν•  인덱슀, λ°°μ—΄μ˜ 길이보닀 큰 값이라면 μ‹€μ œ μ‹œμž‘ μΈλ±μŠ€λŠ” λ°°μ—΄μ˜ 길이둜 μ„€μ •ν•œλ‹€. 음수인 경우 λ°°μ—΄μ˜ λμ—μ„œλΆ€ν„° μš”μ†Œλ₯Ό μ„Έμ–΄λ‚˜κ°„λ‹€.

2️⃣ 번째 인자 - λ°°μ—΄μ—μ„œ μ œκ±°ν•  μš”μ†Œμ˜ 수, μƒλž΅ν•˜κ±°λ‚˜ 값이 (λ°°μ—΄μ˜ 길이 - 1️⃣ 번째 인자 κ°’) 보닀 크면 1️⃣ 번째 인자의 κ°’ λΆ€ν„°μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. 0 μ΄ν•˜λΌλ©΄ μ–΄λ–€ μš”μ†Œλ„ μ œκ±°ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 λ•ŒλŠ” μ΅œμ†Œν•œ ν•˜λ‚˜μ˜ μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ§€μ •ν•΄μ•Ό ν•œλ‹€.

3️⃣ λ²ˆμ§Έ 인자 이상 -  배열에 μΆ”κ°€ν•  μš”μ†Œ, 아무 μš”μ†Œλ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ splice()λŠ” μš”μ†Œλ₯Ό μ œκ±°ν•˜κΈ°λ§Œ ν•œλ‹€.

πŸ”„ λ°˜ν™˜ κ°’ - μ œκ±°ν•œ μš”μ†Œλ₯Ό 담은 λ°°μ—΄, ν•˜λ‚˜μ˜ μš”μ†Œλ§Œ μ œκ±°ν•œ 경우 길이가 1인 배열을 λ°˜ν™˜, 아무 값도 μ œκ±°ν•˜μ§€ μ•Šμ•˜μœΌλ©΄ 빈 배열을 λ°˜ν™˜ν•œλ‹€.

 

πŸ“š μ°Έκ³  μ‚¬μ΄νŠΈ

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

 

Array.prototype.splice() - JavaScript | MDN

splice() λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ κΈ°μ‘΄ μš”μ†Œλ₯Ό μ‚­μ œ λ˜λŠ” κ΅μ²΄ν•˜κ±°λ‚˜ μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜μ—¬ λ°°μ—΄μ˜ λ‚΄μš©μ„ λ³€κ²½ν•©λ‹ˆλ‹€.

developer.mozilla.org