이모티콘을 사다가 일정 금액 이상이되면 사람들은 이모티콘을 구독 서비스를 신청한다고 한다. 그리고 특정 할인율 이상의 이모티콘은 무조건 구입한다고 한다.
(일정 금액과, 특정 할인율은 사람마다 다르다.)
각 이모티콘에다가 할인율(40%, 30%, 20%, 10%) 을 적용해야하는데, 구독 서비스를 가장 많이 신청했을 때의 인원과 그때의 이모티콘 판매액을 구하여라
구독서비스 인원이 없거나 전과 같다면 판매액이 가장 많은 경우를 구하면 된다.
할인율이 4가지 밖에 없다 이모티콘의 개수는 7개이다.
4^7 경우의 수가 생기게 되는데 이는 완탐을 돌려도 충분하다!
할인율이 적용 될 수 있는 모든 경우의 수에서, 구독 서비스 신청 수, 판매 금액을 구하고 비교하면된다.
import java.util.*;
class Solution {
static int maxNumOfSubscriber;
static int maxSalePrice;
static int[] discountRateArray= {40, 30, 20, 10};
public int[] solution(int[][] users, int[] emoticons) {
int[] answer = new int[2];
recur(0, emoticons.length, new int[emoticons.length], users, emoticons);
answer[0] = maxNumOfSubscriber;
answer[1] = maxSalePrice;
return answer;
}
static void recur(int current, int numOfEmoticons, int[] input, int[][] users, int[] emoticons){
if(current == numOfEmoticons){
int numOfSubscriber = 0;
int salePrice = 0;
for(int[] user : users){
int userDiscountRate = user[0];
int userLimit = user[1];
int sum = 0;
for(int i = 0; i < input.length; i++){
if(input[i] >= userDiscountRate) {
sum += emoticons[i] * (100 - input[i]) / 100;
}
}
if(sum >= userLimit) numOfSubscriber++;
else salePrice += sum;
}
if(maxNumOfSubscriber < numOfSubscriber) {
maxNumOfSubscriber = numOfSubscriber;
maxSalePrice = salePrice;
}else if(maxNumOfSubscriber == numOfSubscriber){
maxSalePrice = Math.max(maxSalePrice, salePrice);
}
return;
}
for(int i = 0; i < 4; i++){
input[current] = discountRateArray[i];
recur(current + 1, numOfEmoticons, input, users, emoticons);
}
}
}
카카오 블라인드 당시 풀었던 문제이긴 한데... 카카오는 레벨투도 어렵다..