2024. 5. 24. 14:04ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🚀문제 접근
요구 사항
이모티콘에 할인율을 적용해 구매가능한 모든 이모티콘을 구매했을 때, 구매 비용이 일정 기준을 넘어가면 서비스를 구독하고 그러지 않으면 이모티콘을 구매해서 최대한 많은 구독자를 늘린다.
문제 설계
1. 각각의 이모티콘마다 할인율을 적용한다.
- 적용할 수 있는 할인율은 10, 20, 30, 40퍼센트이다.
- 이모티콘의 갯수가 m개라면 중복순열을 이용해서 m개의 적용할 수 있는 할인율을 구한다.
2. 할인율을 순회하면서 사용자들의 기준에 맞는 할인율인지 판단한다. 맞다면 이모티콘 구매 가격에 할인율을 적용한 가격을 누적한다. 맞지 않다면 넘어간다.
3. 이모티콘 구매가격이 일정 가격 이상이 된다면 서비스를 구독한다. 이 때 서비스 가입자의 수를 늘려준다. 그렇지 않다면 이모티콘 구매가격을 이모티콘 판매액에 누적한다. 그리고 가입자 수와 판매액을 ret 변수에 넣어준다.
4. 문제 조건에 서비스 가입자를 최대한 늘리는 것부터가 우선이기 때문에 ret를 서비스 가입자 수에 맞게 내림차순 정렬한다. 만약 서비스 가입자 수가 같다면 이모티콘 판매액을 기준으로 내림차순 정렬한다.
문제 구현
function solution(users, emoticons) {
const m = emoticons.length;
const rate = [10, 20, 30, 40];
const tmp = [];
const ret = [];
function permutation(level){
if(level === m){
const copyUsers = users.map((elem)=>[...elem, 0]);
tmp.forEach((d, idx)=>{
copyUsers.forEach(([r, m], uIdx)=>{
if(d >= r){
let discount = emoticons[idx] - (emoticons[idx] * (d / 100));
copyUsers[uIdx][2] += discount;
}
});
});
let subscriptions = 0;
let purchase = 0;
copyUsers.forEach(([r, m, p])=>{
if(p >= m) subscriptions += 1;
else purchase += p;
});
ret.push([subscriptions, purchase]);
return;
}
else{
for(let i = 0; i < 4; i++){
tmp.push(rate[i]);
permutation(level + 1);
tmp.pop();
}
}
}
permutation(0);
ret.sort(([s1, p1], [s2, p2])=>{
if(s1 === s2) return p2 - p1;
return s2 - s1;
});
return ret[0];
}
📌주의 사항
구조분해할당은 복사된 값이다.
구현과정에서 배운 점이 있다.
처음 구현할 때 구매 비용에서 할인이 적용된 이모티콘 가격을 빼는 방법으로 구현했다.
그렇다면 예상으로는 copyUsers의 구매비용에 해당하는 요소가 변경되었을 거라고 판단했지만 변경되지 않고 그대로 출력되었다.
const copyUsers = users.map((elem)=>[...elem]);
tmp.forEach((d, idx)=>{
copyUsers.forEach(([r, m])=>{
if(d >= r){
let discount = emoticons[idx] - (emoticons[idx] * (d / 100));
m -= discount;
}
});
console.log(copyUsers) // copyUsers는 변경되지 않는다.
이유는 다음과 같다.
우선 배열의 구조분해할당에서 [r, m]은 원래 배열 요소가 아니라 그 값들을 복사한 새로운 변수이기 때문이다.
즉, 'r'과 'm'은 복사된 값이며, 원래 'copyUsers'배열의 요소와는 독립적이다.
그렇기 때문에 m -= discount 라는 코드를 작성해도 기존의 요소는 변경되지 않는 것이다.
아래의 코드에서도 a와 b를 수정해도 기존의 요소는 변경되지 않는 것을 알 수 있다.
따라서 기존의 요소를 변경하기 위해서는 배열 요소에 직접 접근해서 값을 변경해야한다.
let array = [10, 20];
let [a, b] = array;
a -= 5;
b -= 5;
console.log(a, b); // 5, 15
console.log(array); // [10, 20]
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2️⃣ - 순위 검색(2021 KAKAO BLIND RECRUITMENT) (0) | 2024.05.25 |
---|---|
Level 2️⃣ - 양궁대회 (0) | 2024.05.24 |
Level2️⃣ - 후보키(2019 KAKAO BLIND RECRUITMENT) (0) | 2024.05.23 |
Level2️⃣ - 점 찍기 (0) | 2024.05.23 |
Level2️⃣ - 우박수열 정적분 (0) | 2024.05.23 |