Algorithm | 졸업 선물

🚀·2021년 9월 18일
0

Algorithm

목록 보기
2/5
post-thumbnail

9 / 18

📚 문제

졸업선물

선생님은 올해 졸업하는 반 학생들에게 졸업선물을 주려고 합니다. 학생들에게 인터넷 쇼핑몰에서 각자 원하는 상품을 골라 그 상품의 가격과 배송비를 제출하라고 했습니다. 선생님이 가지고 있는 예산은 한정되어 있습니다.
현재 예산으로 최대 몇 명의 학생에게 선물을 사줄 수 있는지 구하는 프로그램을 작성하세요. 선생님은 상품 하나를 50% 할인해서 살 수 있는 쿠폰을 가지고 있습니다. 배송비는 할인에 포함되지 않습니다.

첫번째 인자에 학생수와 예산이 주어진다. 두 번째 인자부터 n줄까지 각 학생들이 받고 싶은 상품의 가격과 배송비가 입력된다. 상품 가격은 짝수로 입력된다.

스스로 해결 여부
⭕️ 👏🏻

🔍 문제 접근

  1. 학생의 선물 가격과 배송비를 합한 총 가격을 계산한다.
  2. 계산 후 각 상품 가격과 배송비가 입력된 배열을 포함한 배열을 for문을 통해 돌면서 sum이라는 변수에 누적을 한다.
  3. 예산보다 sum이 작거나 같을때 num에 1씩 더한다.

👩🏻‍💻 코드

const getMaxStudentNumber = (budget, arr) => {
  let sum = 0
  let num = 0
  let sumArr = []
  for (let j = 0; j < arr.length; j++) {
    sumArr.push(arr[j][0] / 2 + arr[j][1])
  }
  sumArr.sort((a, b) => a - b)
  console.log(sumArr)
  for (let i = 0; i < sumArr.length; i++) {
    sum += sumArr[i]
    if (sum <= budget) {
      num++
    }
  }
  return num
}
console.log(
  getMaxStudentNumber(28, [
    [6, 6],
    [4, 3],
    [10, 3],
    [4, 5],
    [2, 2],
  ])
) //4

🕵🏻‍♀️ 문제 풀이

  1. 처음에 문제 접근의 방법으로 푸니 만약 모든 상품 가격과 배송비를 더한 값의 배열의 순서가 달라지면 결과가 달라지는 것을 알았다. (왜냐하면 순서대로 각 배열을 접근하면서 sum의 누적할때마다 num이 1이 증가하는데 만약 합이 큰 숫자가 앞에서 먼저 나와버리면 num의 값이 달라질 수 있기 때문)
  2. 그래서 모든 상품 가격과 배송비를 더한 값의 배열을 새로 만든뒤 그 배열을 오름차순으로 정렬했다. 이렇게 되면 작은 수부터 큰 수 순서대로 나오기 때문에 최대한의 num의 값을 구할 수 있기 때문이다.
  3. 이 배열을 처음 문제 접근한 방법대로 for문에 누적을 시키고 만약 예산보다 값이 작거나 같을때 num을 1씩 증가시킨다.

0개의 댓글