문제 :
https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=java
문제 설명 :
- 사용자가 정한 할인율 이상 할인하는 이모티콘을 모두 구매한다.
- 만약, 사용자가 가진돈이상의 이모티콘 구매 금액이 발생할 경우 플러스에 가입을 한다.
- 이모티콘 각각의 할인율을 적절하게 지정하여 최대의 플러스 가입자 수와 이모티콘 판매 금액을 만든다.
접근 :
- 이모티콘의 할인율을 10%, 20%, 30%, 40% 으로 중복을 허용하여 이모티콘의 갯수만큼 조합을 구한다.
- 이모티콘의 할인율이 모두 결정되면 해당 할인율을 이용하여 플러스 가입자 수와 이모티콘 판매 금액을 계산한다.
- 만약, 이전의 결과 보다 플러스 가입자 수가 많다면 현재 결과로 값을 갱신한다.
- 만약, 플러스 가입자 수가 동일하다면, 판매 금액이 큰 결과로 값을 갱신한다.
코드 구현 :
class Solution {
int[] discounts;
int[] res;
private void checkCondition(int[][] users, int[] emoticons){
int[] temp_res = new int[]{0, 0};
for (int[] user : users) {
double totalBuy = 0;
for (int i = 0; i < emoticons.length; i++) {
if (user[0] <= discounts[i])
totalBuy += emoticons[i] * (100 - discounts[i]) / 100.0;
}
if (totalBuy >= user[1]) temp_res[0]++;
else temp_res[1] += (int) totalBuy;
}
// 플러스 가입자 수가 더 많거나, 동일한 경우 더 많은 이익이면 갱신
if (temp_res[0] > res[0] || (temp_res[0] == res[0] && temp_res[1] > res[1])) res = temp_res;
}
private void countAvailable(int[][] users, int[] emoticons, int depth) {
if (depth == emoticons.length) {
checkCondition(users, emoticons);
return;
}
// 40%, 30%, 20%, 10% 할인율을 순차적으로 적용
for (int i = 40; i >= 10; i -= 10) {
discounts[depth] = i;
countAvailable(users, emoticons, depth + 1);
}
}
public int[] solution(int[][] users, int[] emoticons) {
discounts = new int[emoticons.length];
res = new int[]{0, 0};
countAvailable(users, emoticons, 0);
return res;
}
}
'JAVA > Coding Test' 카테고리의 다른 글
[JAVA] 프로그래머스 유사 칸토어 비트열_분할정복 (1) | 2024.10.10 |
---|---|
[JAVA] 프로그래머스 양궁대회_구현 (2) | 2024.09.25 |
[JAVA] 프로그래머스 신고 결과 받기_구현 (1) | 2024.09.04 |
[JAVA] 프로그래머스 우박수열 정적분_누적합 (0) | 2024.09.03 |
[JAVA] 프로그래머스 디펜스 게임_우선순위 큐 (0) | 2024.08.30 |