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

[JavaScript/section 4] 04 - μ‘Έμ—…μ„ λ¬Ό

_μ„±ν˜Έ_ 2022. 9. 15. 11:41
728x90
λ°˜μ‘ν˜•

πŸ“Œ 문제

μ„ μƒλ‹˜μ€ μ˜¬ν•΄ μ‘Έμ—…ν•˜λŠ” 반 ν•™μƒλ“€μ—κ²Œ 쑸업선물을 μ£Όλ €κ³  ν•œλ‹€. ν•™μƒλ“€μ—κ²Œ 인터넷 μ‡Όν•‘λͺ°μ—μ„œ 각자 μ›ν•˜λŠ” μƒν’ˆμ„ 골라 κ·Έ μƒν’ˆμ˜ 가격과 배솑비λ₯Ό μ œμΆœν•˜λΌκ³  ν–ˆλ‹€. μ„ μƒλ‹˜μ΄ κ°€μ§€κ³  μžˆλŠ” μ˜ˆμ‚°μ€ ν•œμ •λ˜μ–΄ μžˆλ‹€. ν˜„μž¬ μ˜ˆμ‚°μœΌλ‘œ μ΅œλŒ€ λͺ‡ λͺ…μ˜ ν•™μƒμ—κ²Œ 선물을 사쀄 수 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

μ„ μƒλ‹˜μ€ μƒν’ˆ ν•˜λ‚˜λ₯Ό 50% ν• μΈν•΄μ„œ(반 가격) μ‚΄ 수 μžˆλŠ” 쿠폰을 κ°€μ§€κ³  μžˆλ‹€. λ°°μ†‘λΉ„λŠ” 할인에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.

 

πŸ“ 풀이

πŸ§‘πŸ»‍πŸ’» λ‚˜μ˜ 풀이 방법

price - μ§€λΆˆν•΄μ•Όν•  가격

  • 각 학생듀이 κ³ λ₯Έ μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
  • λ°˜λ³΅λ¬Έμ„ 돌며 각 학생듀이 κ³ λ₯Έ μƒν’ˆμ— 할인을 λΆ€μ—¬ν•˜κ³  ν• μΈλœ μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 price에 μ €μž₯ν•œλ‹€. (였직 ν•˜λ‚˜μ˜ μƒν’ˆμ—λ§Œ 할인 λΆ€μ—¬)
  • 할인 받은 μƒν’ˆμ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μƒν’ˆλ“€μ„ 돌며 가격과 λ°°μ†‘λΉ„μ˜ 합이 μ˜ˆμ‚°μ„ μ΄ˆκ³Όν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•΄λ‹Ή μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 price에 λˆ„μ ν•˜κ³  countλ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.
  • answer에 μ €μž₯된 κ°’κ³Ό countλ₯Ό λΉ„κ΅ν•˜μ—¬ 더 큰 값을 answer에 μž¬ν• λ‹Ήν•œλ‹€.
function solution(m, product) {
  let answer = 0;
  let n = product.length;
  product.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));

  for (let i = 0; i < n; i++) {
    let price = product[i][0] / 2 + product[i][1];
    let count = 1;

    for (let j = 0; j < n; j++) {
      if (i !== j && price + (product[j][0] + product[j][1]) <= m) {
        price += product[j][0] + product[j][1];
        count++;
      }
    }

    answer = Math.max(answer, count);
  }
  return answer;
}

let arr = [
  [6, 6],
  [2, 2],
  [4, 3],
  [4, 5],
  [10, 3],
];
console.log(solution(28, arr));

 

πŸ‘¨πŸΌ‍🏫 κ°•μ‚¬λ‹˜ 풀이 방법

  • 각 학생듀이 κ³ λ₯Έ μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
  • λ°˜λ³΅λ¬Έμ„ 돌며 각 학생듀이 κ³ λ₯Έ μƒν’ˆμ— 할인을 λΆ€μ—¬ν•˜κ³  ν• μΈλœ μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 μ˜ˆμ‚°μ—μ„œ λΊ€λ‹€. (였직 ν•˜λ‚˜μ˜ μƒν’ˆμ—λ§Œ 할인 λΆ€μ—¬)
  • 할인 받은 μƒν’ˆμ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μƒν’ˆλ“€μ„ 돌며 가격과 λ°°μ†‘λΉ„μ˜ 합이 남은 μ˜ˆμ‚°μ„ μ΄ˆκ³Όν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•΄λ‹Ή μƒν’ˆμ˜ 가격과 λ°°μ†‘λΉ„μ˜ 합을 μ˜ˆμ‚°μ—μ„œ λΉΌκ³  cntλ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.
  • μ΄ˆκ³Όν•œλ‹€λ©΄ 더 이상 μƒν’ˆμ„ ꡬ맀할 수 μ—†μœΌλ―€λ‘œ break문을 μ‚¬μš©ν•˜μ—¬ for문을 λΉ μ Έλ‚˜μ˜¨λ‹€.
  • answer에 μ €μž₯된 κ°’κ³Ό cntλ₯Ό λΉ„κ΅ν•˜μ—¬ 더 큰 값을 answer에 μž¬ν• λ‹Ήν•œλ‹€.
function solution(m, product) {
  let answer = 0;
  let n = product.length;
  product.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));

  for (let i = 0; i < n; i++) {
    let money = m - (product[i][0] / 2 + product[i][1]);
    let cnt = 1;
    for (let j = 0; j < n; j++) {
      if (j !== i && product[j][0] + product[j][1] > money) break;
      if (j !== i && product[j][0] + product[j][1] <= money) {
        money -= product[j][0] + product[j][1];
        cnt++;
      }
    }
    answer = Math.max(answer, cnt);
  }

  return answer;
}

let arr = [
  [6, 6],
  [2, 2],
  [4, 3],
  [4, 5],
  [10, 3],
];
console.log(solution(28, arr));