users | emoticons | result |
---|---|---|
[[40, 10000], [25, 10000]] | [7000, 9000] | [1, 5400] |
[[40, 2900], [23, 10000], [11, 5200], [5, 5900], [40, 3100], [27, 9200], [32, 6900]] | [1300, 1500, 1600, 4900] | [4, 13860] |
class Solution {
static int[] discount = {10, 20, 30, 40};
static int maxPlusService = 0;
static int maxCost = 0;
public int[] solution(int[][] users, int[] emoticons) {
findResult(0, users, emoticons, new int[emoticons.length]);
int[] answer = {maxPlusService, maxCost};
return answer;
}
private void findResult(int index, int[][] users, int[] emoticons, int[] discounts) {
if(index == emoticons.length) {
int plusService = 0;
int cost = 0;
for(int[] user : users) {
int percent = user[0];
int price = user[1];
int sum = 0;
for(int i = 0; i < emoticons.length; i++) {
if(discounts[i] >= percent) {
sum += emoticons[i] / 100 * (100 - discounts[i]);
}
}
if(sum >= price) {
plusService++;
} else {
cost += sum;
}
}
if(plusService > maxPlusService) {
maxPlusService = plusService;
maxCost = cost;
} else if(plusService == maxPlusService) {
maxCost = Math.max(cost, maxCost);
}
return;
}
for(int i = 0; i < 4; i++) { //재귀함수로 할인율 저장
discounts[index] = discount[i];
findResult(index + 1, users, emoticons, discounts);
}
}
}
문제가 복잡해서 머리가 띵해졌다..이딴게 레벨2..?
근데 알고 보니까 꽤 쉬운 문제였다...
우선 제한 사항을 보면 숫자들이 굉장히 작다.
그리고 할인은 10, 20, 30, 40퍼센트로 한정되어 있다.
그럼 나올 수 있는 경우의 수는 4^7...
완전 탐색을 이용하여 해결하였다.
완전탐색으로 할인 가능한 모든 경우의 수를 탐색하였다.
각각의 경우에 대해 모든 유저들이 계산을 하고 최대값을 구했다.
숫자가 작은 경우 완전 탐색을 항상 생각하자.