문제
풀이
- 문제를 읽고 바로 중복 순열을 떠올렸다면 엄청 간단하게 풀 수 있는 문제였다.
- 이모티콘의 할인된 금액을 구해야 하고 서로 다른 이모티콘이 동일한 할인률을 가질 수 있기 때문에 할인률에 대한 중복 순열을 구해준다. (이모티콘이 최대 7개라서 시간 초과가 발생하지 않는다.)
- 중복 순열 각 케이스와 유저 배열을 순회하면 각 케이스에 대한 이모티콘 플러스 서비스 가입자 수와 이모티콘 판매액을 구한다.
- 순회하며 구한 정답 배열을 가입자 수를 기준으로 내림차순하며, 가입자 수가 동일한 경우 판매액을 기준으로 내림차순한다.
소스 코드
function solution(users, emoticons) {
const result = [];
let temp = [];
const rate = [10, 20, 30, 40];
const answer = [];
function getDupPermutation(cnt) {
if (cnt === emoticons.length) {
result.push([...temp]);
return;
}
for (let i = 0; i < 4; i++) {
temp.push(rate[i]);
getDupPermutation(cnt + 1);
temp.pop();
}
}
getDupPermutation(0);
for (const target of result) {
let count = 0;
let total = 0;
for (const [userRate, userPrice] of users) {
let subTotal = 0;
for (let i = 0; i < target.length; i++) {
if (target[i] < userRate) continue;
subTotal += emoticons[i] * (1 - target[i] * 0.01);
}
if (subTotal < userPrice) total += subTotal;
else count += 1;
}
answer.push([count, total]);
}
return answer.sort((a, b) => {
if (a[0] === b[0]) return b[1] - a[1];
return b[0] - a[0];
})[0];
}