문제설명
학생들에게 졸업선물을 해주기 위해 갖고 학생들에게 직접 갖고 싶은물건의 가격과 배송비를 알아오라고 했다.
선생님에겐 한정된 예산과, 물건값의 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 비용이 딱떨이다.
'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글
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 |
댓글