코딩테스트 with JS/백준, 프로그래머스
프로그래머스) 이모티콘 할인행사
5_hyun
2023. 2. 7. 23:55
반응형
-문제 사이트
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
function solution(users, emoticons) {
let count = 0,
money = 0;
let allCase = [];
let disCount = [10, 20, 30, 40];
// 모든 경우의 수를 구해주는 DFS
function DFS(emotions, case1) {
if (emotions.length < 1) {
allCase.push(case1);
return;
}
for (let i = 0; i < 4; i++) {
DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
}
}
DFS(emoticons, []);
// 할인된 가격 구해주는 함수
const disCountPrice = (per, price) => ((100 - per) / 100) * price;
// way는 한 가지 경우의 수
allCase.forEach((way) => {
let tempC = 0,
tempM = 0;
users.forEach((user) => {
let price = 0;
way.forEach((info) => {
if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
});
if (price >= user[1]) tempC++;
else tempM += price;
});
if (count < tempC) {
count = tempC;
money = tempM;
} else if (count === tempC) {
money = Math.max(money, tempM);
}
});
return [count, money];
}
풀이 방법
이 문제는 처음에 for문을 최대한 사용하지 않을 생각에 막막했지만 의외로 그냥 단순하게 풀면되는 문제이다.
function DFS(emotions, case1) {
if (emotions.length < 1) {
allCase.push(case1);
return;
}
for (let i = 0; i < 4; i++) {
DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
}
}
DFS(emoticons, []);
DFS 함수를 이용해서 이모티콘 할인율에 대한 모든 경우의 수를 구하고 allCase에 저장한다. allCase에는 위 사진처럼 저장된다.
// 할인된 가격 구해주는 함수
const disCountPrice = (per, price) => ((100 - per) / 100) * price;
// way는 한 가지 경우의 수
allCase.forEach((way) => {
let tempC = 0,
tempM = 0;
users.forEach((user) => {
let price = 0;
way.forEach((info) => {
if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
});
if (price >= user[1]) tempC++;
else tempM += price;
});
if (count < tempC) {
count = tempC;
money = tempM;
} else if (count === tempC) {
money = Math.max(money, tempM);
}
});
allCase에 저장된 모든 경우의 수를 순회한다. 그리고 각 user에 대한 모든 할인값을 구하고 플러스 서비스 가입여부를 판단한다. 이를 tempC, tempM에 저장하고 최종 반환하는 count와 money와 비교 후 값을 최신화시킨다.
반응형