카카오톡에서는 이모티콘을 무제한으로 사용할 수 있는 이모티콘 플러스 서비스 가입자 수를 늘리려고 합니다.
이를 위해 카카오톡에서는 이모티콘 할인 행사를 하는데, 목표는 다음과 같습니다.이모티콘 플러스 서비스 가입자를 최대한 늘리는 것.
이모티콘 판매액을 최대한 늘리는 것.
1번 목표가 우선이며, 2번 목표가 그 다음입니다.
카카오톡 사용자 n명의 구매 기준을 담은 2차원 정수 배열 users, 이모티콘 m개의 정가를 담은 1차원 정수 배열 emoticons가 주어집니다. 이때, 행사 목적을 최대한으로 달성했을 때의 이모티콘 플러스 서비스 가입 수와 이모티콘 매출액을 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해주세요.
1 ≤ users의 길이 = n ≤ 100
users의 원소는 [비율, 가격]의 형태입니다.
users[i]는 i+1번 고객의 구매 기준을 의미합니다.
비율% 이상의 할인이 있는 이모티콘을 모두 구매한다는 의미입니다.
1 ≤ 비율 ≤ 40
가격이상의 돈을 이모티콘 구매에 사용한다면, 이모티콘 구매를 모두 취소하고 이모티콘 플러스 서비스에 가입한다는 의미입니다.
100 ≤ 가격 ≤ 1,000,000
가격은 100의 배수입니다.
1 ≤ emoticons의 길이 = m ≤ 7
emoticons[i]는 i+1번 이모티콘의 정가를 의미합니다.
100 ≤ emoticons의 원소 ≤ 1,000,000
emoticons의 원소는 100의 배수입니다.
이모티콘마다 할인율은 다를 수 있으며, 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다.
제한사항을 자세히 보면 가격은 100의 배수이기에 비율에 따라서 double형과 같은 실수형을 쓸 필요가 없다. 또한 순열값을 구하기만 하면 되는데 users의 길이가 100이고
할인율은 4개이기 때문에 이모티콘의 길이는 최대 7
4^7 = 16,384이며 우리가 최대로 구하는 값은 1,638,400개이다. 따라서 브루트 포스로 해결이 가능하다.
코드
import java.util.*;
class Solution {
ArrayList<int[]> list;
public int[] solution(int[][] users, int[] emoticons) {
list =new ArrayList<>();
dfs(0,emoticons.length,users,emoticons,new int[emoticons.length]);
Collections.sort(list,(int[] o1,int[] o2)->{
if(o1[0]==o2[0]){
return o2[1]-o1[1];
}else{
return o2[0]-o1[0];
}
});
return list.get(0);
}
//순열뽑기
void dfs(int depth,int r,int[][] users,int[] emo,int[] arr){
if(depth ==r){
int count=0,total=0;
for(int i=0;i<users.length;i++){
int sum=0;
for(int j=0;j<r;j++){
if(arr[j]>=users[i][0]){
sum+=emo[j]-(emo[j]/100*arr[j]);
}
}
if(sum>=users[i][1]){
count++;
}else{
total+=sum;
}
}
list.add(new int[]{count,total});
return;
}
for(int i=1;i<=4;i++){
arr[depth]= i*10;
dfs(depth+1,r,users,emo,arr);
}
}
}
문제 파악만 가능하고 순열만 만들수있다면 문제해결은 간단한 문제였다.