이모티콘 할인행사
카카오톡에서는 이모티콘을 무제한으로 사용할 수 있는 이모티콘 플러스 서비스 가입자 수를 늘리려고 합니다.
이를 위해 카카오톡에서는 이모티콘 할인 행사를 하는데, 목표는 다음과 같습니다.
- 이모티콘 플러스 서비스 가입자를 최대한 늘리는 것.
- 이모티콘 판매액을 최대한 늘리는 것.
1번 목표가 우선이며, 2번 목표가 그 다음입니다.
이모티콘 할인 행사는 다음과 같은 방식으로 진행됩니다.
n
명의 카카오톡 사용자들에게 이모티콘m
개를 할인하여 판매합니다.- 이모티콘마다 할인율은 다를 수 있으며, 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다.
카카오톡 사용자들은 다음과 같은 기준을 따라 이모티콘을 사거나, 이모티콘 플러스 서비스에 가입합니다.
- 각 사용자들은 자신의 기준에 따라 일정 비율 이상 할인하는 이모티콘을 모두 구매합니다.
- 각 사용자들은 자신의 기준에 따라 이모티콘 구매 비용의 합이 일정 가격 이상이 된다면, 이모티콘 구매를 모두 취소하고 이모티콘 플러스 서비스에 가입합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/150368
import java.util.*;
public class Main {
public static void main(String[] args) {
int[][] users = {{40, 2900}, {23, 10000}, {11, 5200}, {5, 5900}, {40, 3100}, {27, 9200}, {32, 6900}};
int[] emticons = {1300, 1500, 1600, 4900};
var reuslt = solution(users, emticons);
System.out.println(Arrays.toString(reuslt));
}
public static int[] solution(int[][] users, int[] emoticons) {
Emoticon[][] emoticonAble = new Emoticon[emoticons.length][4];
for (int i = 0; i < emoticons.length; i++) {
for (int l = 0; l < 4; l++) {
emoticonAble[i][l] = new Emoticon((l + 1) * 10, emoticons[i] - (int) ((l + 1) * 0.1 * emoticons[i]), emoticons[i]);
}
}
LinkedList<Emoticon> list = new LinkedList<>();
for (int i = 0; i < 4; i++) {
list.add(emoticonAble[0][i]);
}
for (int i = 1; i < emoticonAble.length; i++) {
int size = list.size();
for (int k = 0; k < size; k++) {
Emoticon e = list.poll();
for (int l = 0; l < 4; l++) {
var target = emoticonAble[i][l].clone();
target.back = e;
list.add(target);
}
}
}
int maxSubscr = 0;
int maxTotalPay = 0;
for (int i = 0; i < list.size(); i++) {
Emoticon e = list.get(i);
Emoticon[] tempList = new Emoticon[emoticons.length];
int index = 0;
while (e != null) {
tempList[index] = e;
index++;
e = e.back;
}
int tempTotalPay = 0;
int tempSubscr = 0;
for (int[] user : users) {
int temptempPay = 0;
int sale = user[0];
int payLimit = user[1];
for (Emoticon emoticon : tempList) {
if (emoticon.sale >= sale) {
temptempPay += emoticon.cost;
}
if (temptempPay >= payLimit) {
temptempPay = 0;
tempSubscr++;
break;
}
}
tempTotalPay += temptempPay;
}
if (tempSubscr > maxSubscr) {
maxSubscr = tempSubscr;
maxTotalPay = tempTotalPay;
} else if (tempSubscr == maxSubscr && tempTotalPay > maxTotalPay) {
maxTotalPay = tempTotalPay;
}
}
return new int[]{maxSubscr, maxTotalPay};
}
}
class Emoticon {
int sale;
int cost;
int originalCost;
Emoticon back;
Emoticon(int sale, int cost, int originalCost) {
this.sale = sale;
this.cost = cost;
this.originalCost = originalCost;
}
public Emoticon clone() {
return new Emoticon(sale, cost, originalCost);
}
}