4-4) 졸업 선물

김예지·2021년 8월 27일
1

문제

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


문제 풀이

예습 이론

  • sort 메소드
    https://www.w3schools.com/js/js_array_sort.asp
    sort((a, b)=>a-b)는 오름차순, sort((a, b)=>b-a)는 내림차순이다.
  • 자바스크립트는 유연하기 때문에, 변수선언부가 없더라도 실행은 되지만 좋지 않은 코드이기 때문에 반드시 선언해주자!(let, const)

코드

(1) product배열을 총비용 순서로 정렬한다. (sort 메소드 사용)
(2) for문을 돌면서, 할인을 하나씩 적용해보고 살 수 있는 상품수를 구한다. 가장 많이 살 수 있는 상품수를 answer으로 리턴한다.

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(m, product){
                let answer=0; //카운팅
                let n=product.length;
                product.sort((a, b)=>(a[0]+a[1])-(b[0]+b[1])); //a[0]:가격, a[1]:배송비(오름차순 정렬)
                console.log(product);
                //완전탐색(할인을 모두 적용해보기)
                //i: 할인 받는 상품, j: 나머지 상품
                for(let i=0; i<n; i++){
                  let money=m-(product[i][0]/2+product[i][1]); //짝수니까 나눠떨어짐. 즉, Mathfloor같은것 하지 않아도 됨
                  let cnt=1;
                  for(let j=0; j<n; j++){
                    if(j!==i && (product[j][0]+product[j][1])>money) break; //break안걸어주면 돈도 없는데 for문을 계속 돔
                    if(j!==i && (product[j][0]+product[j][1])<=money){
                      money-=(product[j][0]+product[j][1]);
                      cnt++; //상품을 하나 더 샀다 
                    }
                  }
                  answer=Math.max(answer, cnt); //answer, cnt중 큰값을 answer으로 대입
                }
                return answer;
            }
            
            let arr=[[6, 6], [2, 2], [4, 3], [4, 5], [10, 3]];
            console.log(solution(28, arr));
        </script>
    </body>
</html>
profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2021년 9월 12일

9/12

답글 달기
comment-user-thumbnail
2021년 9월 13일

9/13
product.sort((a, b)=>(a[0]+a[1])-(b[0]+b[1]))

답글 달기