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);
주의
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;