본문 바로가기
문제풀이/인프런 알고리즘 문제풀이

4-4 졸업선물

by dev_kong 2021. 12. 20.
728x90
728x90

문제설명

학생들에게 졸업선물을 해주기 위해 갖고 학생들에게 직접 갖고 싶은물건의 가격과 배송비를 알아오라고 했다.

선생님에겐 한정된 예산과, 물건값의 50%를 할인해주는 쿠폰이 있다.

단, 50% 할인 쿠폰은 물건값만 할인되고, 배송비는 할인 되지 않는다.

선생님의 한정된 예산으로 졸업선물을 사줄 수 있는 최대학생수를 구해라.

const budget = 28;
const arr = [
  [6, 6],
  [2, 2],
  [4, 3],
  [4, 5],
  [10, 3],
];

budget 은 예산을 나타내고

학생수는 arr.length 이다.

arr[n][0]은 물건의 가격을

arr[n][1]은 물건의 배송비를 나타낸다.

 

접근방법

30분동안 그림도 그리고 손코딩도 해보고 이거저거 다해봤는데 감이 안잡혀서,

결국 풀이 강의를 통해 어떻게 접근해야 되는지를 알게됐다.

 

우선 arr을 오름차순으로 정리하고,

이중for문을 이용해

arr[i]에는 50%로 쿠폰을 적용한 총 금액을

budget에서 뺀 뒤에,

arr[j]의 값과 남은 예산을 비교해서

예산이 더 크면

예산에서 arr[j]를 뺀다.

하나 뺄때마다 카운트에 1을 더해주고

예산이 초과되면, answer와 카운트를 비교해서 큰 숫자를 answer에 할당한다.

 

function solution(budget, arr) {
  let answer = 0;
  const numOfStudent = arr.length;

  arr.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
  for (let i = 0; i < numOfStudent; i++) {
    let restMoney = budget - (arr[i][0] / 2 + arr[i][1]);
    let count = 1;
    for (let j = 0; j < numOfStudent; j++) {
      if (i !== j && arr[j][0] + arr[j][1] <= restMoney) {
        restMoney -= arr[j][0] + arr[j][1];
        count += 1;
      }
      answer = Math.max(answer, count);
    }
  }
  return answer;
}

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

막상 코드를 짜고보니 생각보다 간단하다.

 

function solution(budget, arr) {
  let answer = 0;
  const numOfStudent = arr.length;

  arr.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
  for (let i = 0; i < numOfStudent; i++) {
    let restMoney = budget - (arr[i][0] / 2 + arr[i][1]);
    let count = 1;
    }

일단 answer 무지성 할당 해주고,

학생수를 나타내는 변수를 선언하고 할당했다.

그리고 sort를 이용해 arr을 오름차순으로 정리했다.

 

이중 for문의 첫번째에선 arr[i]에 쿠폰을 적용한 뒤,

budget에서 빼주고, 남은 금액을 나타내는 변수를 선언하고 할당했다.

budget에서 값을 뺐다는 뜻은 물건을 샀다는 것이므로 카운터에 0이 아닌  1을 할당해준다.

 

function solution(budget, arr) {
  let answer = 0;
  const numOfStudent = arr.length;

  arr.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
  for (let i = 0; i < numOfStudent; i++) {
    let restMoney = budget - (arr[i][0] / 2 + arr[i][1]);
    let count = 1;
    for (let j = 0; j < numOfStudent; j++) {
      if (i !== j && arr[j][0] + arr[j][1] <= restMoney) {
        restMoney -= arr[j][0] + arr[j][1];
        count += 1;
      }
      answer = Math.max(answer, count);
    }
  }
  return answer;
}

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

두번째 for문을 통해, restMoney 와 arr[j]값을 비교한다.

그리고 if 문을 통해 예산이 초과 되는 경우와

i 와 j가 일치하는 경우(=같은 물건을 두번 사는거다)를 걸러주고

restMoney에서 arr[j]값을 빼준 뒤

count에 1을 더해준다.

count와 answer를 비교한 뒤 큰 값을 answer에 할당해준다.

for문이 끝나면 answer를 리턴한다.

 

위의 에제에선 4가 출력된다.

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

 

728x90
728x90

'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글

4-5 k번째 큰수  (0) 2021.12.20
4-3 멘토링  (0) 2021.12.20
4-2 뒤집은 소수  (0) 2021.12.14
4-1 자릿수의 합  (0) 2021.12.14
격자판 최대합  (0) 2021.12.10

댓글