https://school.programmers.co.kr/learn/courses/30/lessons/150368
핵심
우리가 각각의 이모티콘을 10,20,30,40 퍼로 할인시킬 수 있다. 이때 구독자수를 최대로 하고, 이후에 가장 많은 돈을
벌게 하자. 이모티콘은 최대 7개이다. 즉 4^7가지의 경우의 수가 생기기 때문에 완전탐색을 사용하였다.
정답 코드
class Solution {
static int[] discount = {10,20,30,40};
static int maxOfSubscribe;
static int maxOfCost;
public int[] solution(int[][] users, int[] emoticons) {
findResult(0,emoticons.length, new int[emoticons.length],users,emoticons);
return new int[]{maxOfSubscribe,maxOfCost};
}
public void findResult(int index,int emoticonsLength, int[] discounts,int[][] users, int[] emoticons){
if (index == emoticonsLength){
int subscribe = 0;
int cost = 0;
for (int[] user: users){
int userDiscountRate = user[0];
int userMaxCost = user[1];
int sum = 0;
for (int i = 0; i < emoticons.length; i++){
if (discounts[i]>=userDiscountRate){
sum += emoticons[i]/100*(100-discounts[i]);
}
}
if (sum>=userMaxCost)subscribe++;
else cost+=sum;
}
if (subscribe>maxOfSubscribe){
maxOfSubscribe = subscribe;
maxOfCost = cost;
}else if (subscribe == maxOfSubscribe){
maxOfCost = Math.max(maxOfCost,cost);
}
return;
}
for (int i = 0; i < 4; i++){
discounts[index] = discount[i];
findResult(index+1,emoticonsLength,discounts,users,emoticons);
}
}
}
해설
앞서 말한 대로 우리가 원하는 대로 할인을 적용할 수 있다.
따라서 findResult에서 각각의 할인률을 담을 새로운 배열을 매개변수로 담았다.
그리고 완전탐색을 통해 10~40까지 모든 경우의 수의 할인율을 적용하였다.
만약 모든 할인률을 적용했다면 각 유저마다 원하는 할인률 이상인 이모티콘을 구매한다.
그리고 총합이 최대금액보다 높으면 구독을 하고, 아니면 그냥 구매를 한다.
이후 최대 구독자를 1순위로 하기 때문에 구독자가 많은 결과를 최고 값으로 설정한다.
이후 구독자가 같으면 금액을 최대로 한다.
배운 점
프로그래머스 2 레벨인데도, 쉽지 않다고 느꼈다.
문제의 지문이 길기 때문에 놓치는 부분이 있는지 확실하게 파악하고 구현해야 한다.
또한 구현전에 시간복잡도를 잘 체크하고 코딩을 해야 한다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 17135번 캐슬 디펜스(java) (4) | 2023.03.01 |
---|---|
[프로그래머스] 아이템 줍기(java) (1) | 2023.03.01 |
[백준]15559번 내 선물을 받아줘(java) (2) | 2023.02.26 |
[백준] 17090번 미로 탈출하기(java) (0) | 2023.02.24 |
[백준] 1374번 강의실 (0) | 2023.02.20 |