문제
[https://school.programmers.co.kr/learn/courses/30/lessons/150368]
코드
function solution(users, emoticons) {
const result = [0, 0];
const salePercent = [10, 20, 30, 40];
function dfs(n) {//할인 퍼센트 구해주는 함수
if (n.length === emoticons.length) {
purchase(n);
return;
}
for (let i = 0; i < salePercent.length; i++) {
dfs([...n, salePercent[i]]);
}
}
dfs([]);
function purchase(n) {//할인 퍼센트를 받아서 비교해주는 함수
let enroll = 0;
let total = 0;
const salePrice = emoticons.map((e, i) => {
return e * (100 - n[i]) * 0.01;
});
for (let user of users) {
let money = 0;
for (let i = 0; i < n.length; i++) {
if (user[0] <= n[i]) {
//이모티콘 구입
money += salePrice[i];
}
}
//총 금액이 본인꺼보다 많으면 - 이모티콘 안사고 플러스 가입
if (money >= user[1]) {
enroll += 1;
} else {
total += money;
}
}
if (result[0] < enroll) {
result[0] = enroll;
result[1] = total;
} else if (result[0] === enroll && result[1] < total) {
result[0] = enroll;
result[1] = total;
}
}
return result;
}
풀이
- 문제를 요약해보면 emoticons 배열의 각 이모티콘 가격에 10% ~ 40%까지의 할인률을 적용했을 때 이 할인률이 유저의 기준 할인률(0번째 index)보다 크다면 이모티콘을 구입하고 그렇지 않다면 구입하지 않음
- 각 유저당 emoticons 배열을 돌면서 구입할 이모티콘이 있다면 값을 더해주고 , 최종 값이 유저의 기준 값(첫번째 index)보다 크다면, 이모티콘을 전부 구매하지 않고 이모티콘 플러스를 구독함 / 작을시에는 구독하지 않고 개별 이모티콘만 구매
- emoticons 길이가 최대 7밖에 안되기 때문에 10~40까지 어떤 할인률을 가질지 백트래킹으로 구해줄 수 있음
- 예를 들면 이모티콘이 두개라면 (10,10) , (10,20) , (10,30) ...
- 할인률을 구했다면 purchase 함수에서 할인률을 인자로 받아 for문을 이용해서 각 유저별로 기준 할인률과 비교해서 구입할지 안할지를 선택
- for문이 끝나면 해당 할인률에는 몇명이 구독하고 얼마를 구매할지를 알 수 있으니, 기존의 result값과 비교해서 넣어주면 됨(구독자 수가 우선)
'코딩테스트 연습' 카테고리의 다른 글
백준 2217 - 로프 (1) | 2023.04.20 |
---|---|
프로그래머스 - 과제 진행하기 (0) | 2023.04.19 |
프로그래머스 - 혼자서 하는 틱택토 (0) | 2023.04.18 |
프로그래머스 - 두 원 사이의 정수 쌍 (0) | 2023.04.17 |
백준 1874 - 스택 수열 (0) | 2023.04.17 |