이모티콘 할인행사
2024. 5. 28. 14:36ㆍ알고리즘/카카오
https://school.programmers.co.kr/learn/courses/30/lessons/150368
- 난이도 : Level 2, 정답률 38%
- 소요 시간 : 25분
- 실행 결과 : 성공
이모티콘이 7개이고 적용할 수 있는 할인율이 4개이기 때문에 중복순열을 사용했을 때 최악의 경우 4의 7승이므로 완전탐색으로 구현할 수 있겠다고 판단했다. 따라서 중복순열을 이용해 적용할 수 있는 모든 할인율의 경우의 수를 구해 할인율을 적용한 할인 금액을 구한다. 그리고 users를 순회하며 유저마다 기준 할인율 이상으로 할인이 적용된 이모티콘을 구매한다. 그 다음 구매 금액과 기준 금액을 비교해 서비스에 가입할지 아니면 이모티콘을 구매할 지 데이터를 저장한 다음 ret 배열에 넣어준다. 문제의 요구사항에 따라 첫번째 목표를 먼저 달성하는 것이 중요하므로 ret를 정렬해주면 된다.
function solution(users, emoticons) {
const ret = [];
const rate = [10, 20, 30, 40];
const tmp = [];
// 중복순열을 이용해 적용할 수 있는 할인율의 모든 경우의 수를 구한다.
function permutation(level){
if(level === emoticons.length){
const answer = [0, 0];
// 할인율을 적용한 할인 금액을 구한다.
const discounts = [...emoticons].map((price, idx)=>{
const discountPrice = price - price * (tmp[idx] / 100);
return discountPrice;
});
// 유저마다 기준 할인율 이상으로 적용된 이모티콘을 구매한다.
users.forEach(([userRate, userMoney], idx)=>{
let purchase = 0;
tmp.forEach((discountRate, idx)=>{
if(discountRate >= userRate) purchase += discounts[idx];
});
// 기준 금액보다 구매 금액이 같거나 초과하면 서비스에 가입, 그러지 않으면 이모티콘 구매
if(userMoney <= purchase) answer[0] += 1;
else answer[1] += purchase;
});
ret.push(answer);
return;
}
else{
for(let i = 0; i<rate.length; i++){
tmp.push(rate[i]);
permutation(level + 1);
tmp.pop();
}
}
}
permutation(0);
ret.sort(([subScriber1, sales1], [subScriber2, sales2])=>{
if(subScriber1 === subScriber2) return sales2 - sales1;
return subScriber2 - subScriber1;
});
return ret[0];
}
'알고리즘 > 카카오' 카테고리의 다른 글
주차 요금 계산 (0) | 2024.05.29 |
---|---|
양궁 대회 (0) | 2024.05.29 |
두 큐 합 같게 만들기 (0) | 2024.05.28 |
개인정보 수집 유효기간 (0) | 2024.05.27 |
가장 많이 받은 선물 (0) | 2024.05.27 |