본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 졸업 선물

by spare8433 2023. 10. 18.

문제 : 졸업 선물



문제 설명


선생님은 올해 졸업하는 반 학생들에게 졸업선물을 주려고 합니다.
학생들에게 인터넷 쇼핑몰에서 각자 원하는 상품을 골라 그 상품의 가격과 배송비를 제출하라
고 했습니다. 선생님이 가지고 있는 예산은 한정되어 있습니다.


현재 예산으로 최대 몇 명의 학생에게 선물을 사줄 수 있는지 구하는 프로그램을 작성하세요.
선생님은 상품 하나를 50% 할인해서(반 가격) 살 수 있는 쿠폰을 가지고 있습니다. 배송비는
할인에 포함되지 않습니다.


※ 문제와 답안지를 제공한 제작자가 중요치 않은 일부 파라미터 생략하는 등 일부 다를 수 있습니다. (크게 문제되는 부분은 없음)


▣ 입력설명

첫 번째 줄에 반 학생수 N(1<=N<=1000)과 예산 M(1<=M<=100,000,000)이 주어진다.
두 번째 줄부터 N줄에 걸쳐 각 학생들이 받고 싶은 상품의 가격과 배송비가 입력됩니다.
상품가격과 배송비는 각각 100,000을 넘지 않습니다. 상품가격은 짝수로만 입력됩니다.


▣ 출력설명

첫 번째 줄에 선생님이 현재 예산으로 선물할 수 있는 최대 학생수를 출력합니다.
선생님 최소한 1개 이상의 상품을 살 수 있는 예산을 가지고 있습니다.


▣ 입력예제 1

5 28
6 6
2 2
4 3
4 5
10 3


▣ 출력예제 1

4


출력설명

(2, 2), (4, 3), (4, 5)와 (10, 3)를 할인받아 (5, 3)에 사면 비용이 4+7+9+8=28입니다.



내코드


function solution(m, product) {
  let answer = 0; // 최대 학생수
  let answerArr = []; // 최대 학생 수 (조합 결과를 보기위함)

  // 상품 가격 + 배송비 기준 오름차순 정렬
  let sortArr = product.sort((a, b) => {
    let totalPriceA = a[0] + a[1];
    let totalPriceB = b[0] + b[1];
    return totalPriceA - totalPriceB;
  });

  // 전체 학생 순회 index번 학생은 할인된 가격을 적용할 학생이다.
  for (let index = 0; index < sortArr.length; index++) {
    let sum = 0;
    let count = 0;
    let currentArr = [];

    // 전체 학생 한번더 순회
    for (let i = 0; i < sortArr.length; i++) {
      // index 번 학생을 할인 적용해서 가격을 더해감
      if (index === i) {
        sum += sortArr[i][0] / 2 + sortArr[i][1];
      } else {
        sum += sortArr[i][0] + sortArr[i][1];
      }

      // 예산을 넘어가면 count 올리지않고 끝냄
      if (sum > m) break;

      // 예산안쪽이면 카운트와 학생 조합을 추가함
      currentArr.push(sortArr[i]);
      count++;
      if (sum === m) break; // 예산에 딱 맞으면 다음 단계 스킵

    }

    // 최대값을 넘어가면 학생 수와 조합을 저장
    if (answer < count) {
      answer = count;
      answerArr = [...currentArr];
    }

    sum = 0;
    count = 0;
    currentArr = [];
  }
  // console.log("결과 배열:", answerArr);
  return answer;
}

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



풀이


  1. 상품 가격와 배송비의 합을 기준으로 오름차순 정렬
  2. 이 중 for 문으로 처음 for 문은 전체 학생 순회하고 index번 학생은 할인된 가격을 적용할 학생이다
  3. 안에 for 문은 전체 학생 한번 더 순회하고 index 번 학생을 할인 적용해서 가격을 더해감
  4. 예산에 맞게 가격의 합과 카운트를 계산해 최대 학생 수와 조합을 저장



보완할 수 있는 부분


// 현재 코드
let sortArr = product.sort((a, b) => {
  let totalPriceA = a[0] + a[1];
  let totalPriceB = b[0] + b[1];
  return totalPriceA - totalPriceB;
});

// 보완 코드
let sortArr = product.sort((a, b) => (a[0] + a[1]) - (b[0] + b[1]));

보완 내용

명시적으로 a or b[0], a or b[1] 의 내용을 명시적으로 표시하고 한 줄로 간단하게 줄일 수 있다.




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard