졸업선물

minho·2022년 2월 21일
0

문제

내코드

const arr =[[8, 6], [2, 2], [4, 3], [4, 5], [12, 1]];
let m = 28;

let answer = 0;
arr.sort((a,b)=> {
    return (a[0]+a[1]) - (b[0]+b[1]);
})
console.log(arr);

for(let j=0; j<arr.length; j++){
    let sum = 0;
    let cnt = 0;
    for(let i = 0; i<arr.length; i++) {
        if(m<sum) {            
            break;
        } 
        if(i===j) sum += (arr[i][0]/2) + arr[i][1];
        else sum += arr[i][0] + arr[i][1];
        
        if(sum<=m) cnt++; 
        else break;      //break를 두번 설정해줘야함 -> 비효율적            
    }
    answer = Math.max(answer,cnt);
}

console.log(answer);

원리

  • 50%할인쿠폰을 모든 상품에 적용해본다.
    선물과 배송비가 각각다르므로 모든 경우를 확인해야 한다.

주의
break가 작동하기 위해서는 sum의 값이 상품가격을 더하기 전에도 m보다 작아야 하며, 더한 후에도 m보다 작아야 한다.
-> 이 문제를 해결하기 위해 break를 두번 사용하니 비효율적이다.

코드개선

break를 한번에 작동시킬 수 있도록 sum을 더해줘 m과 비교하는 것이 아닌 m에서 가격을 빼서 남은 m을 기준으로 break를 작동시킨다.

const arr =[[8, 6], [2, 2], [4, 3], [4, 5], [12, 1]];
let m = 28;

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;
 
profile
Live the way you think

0개의 댓글