
https://school.programmers.co.kr/learn/courses/30/lessons/150368
from itertools import product
def solution(users, emoticons):
answer = []
sales_percent=[10,20,30,40]
cases=list(product(sales_percent,repeat=len(emoticons)))
for case in cases:
plus_service=0
sales_total=0
for user in users:
total=0
add_service=False
for i in range(len(emoticons)):
if case[i]>=user[0]:
total+=emoticons[i]*(100-case[i])//100
if total>=user[1]:
plus_service+=1
add_service=True
break
if not add_service:
sales_total+=total
answer.append([plus_service,sales_total])
answer.sort(key=lambda x:(x[0],x[1]))
# print(answer)
return answer[-1]
import java.util.*;
class Solution {
public static List<int[]> generateProducts(int[] arr,int r){
List<int[]> products=new ArrayList<>();
int[] product=new int[r];
generateProduct(arr,r,product,0,products);
return products;
}
public static void generateProduct(int[] arr,int r,int[] product, int index,List<int[]> products){
if(r==index){
products.add(product.clone());
return;
}
for(int i=0;i<arr.length;i++){
product[index]=arr[i];
generateProduct(arr,r,product,index+1,products);
}
}
public int[] solution(int[][] users, int[] emoticons) {
int[] answer = {};
int[] percentList={10,20,30,40};
List<int[]> allCases=generateProducts(percentList,emoticons.length);
int caseMaxServiceOwnerNum=0;
int caseMaxTotal=0;
for(int[] oneCase:allCases){
int caseServiceOwner=0;
int caseTotal=0;
for(int[] user:users){
int oneUserTotal=0;
boolean userServiceOwned=false;
for(int i=0;i<emoticons.length;i++){
if(oneCase[i]>=user[0]){
oneUserTotal+=(emoticons[i])*(100-oneCase[i])/100;
}
if(oneUserTotal>=user[1]){
caseServiceOwner+=1;
userServiceOwned=true;
break;
}
}
if(!userServiceOwned){
caseTotal+=oneUserTotal;
}
}
if(caseServiceOwner>caseMaxServiceOwnerNum){
caseMaxServiceOwnerNum=caseServiceOwner;
caseMaxTotal=caseTotal;
}else if(caseServiceOwner==caseMaxServiceOwnerNum&&caseTotal>caseMaxTotal){
caseMaxTotal=caseTotal;
}
}
answer=new int[]{caseMaxServiceOwnerNum,caseMaxTotal};
return answer;
}
}
이 문제는 각 이모티콘에 대해 모든 할인율을 적용해보는 것을 요구합니다. 이모티콘의 개수가 최대 7개이고, 할인율이 4개이기 때문에 가능한 경우의 수는 로 충분히 시간 내에 해결할 수 있습니다
중복 순열을 사용하여 가능한 모든 할인율 조합을 구했습니다. 이를 통해 각 조합에 대해 모든 사용자의 구매 여부를 탐색할 수 있었습니다.
각 조합이 적용된 경우에 대해, 사용자의 구매 금액과 서비스 가입 여부를 확인했습니다. 이를 통해 모든 경우를 확인할 수 있었습니다.
각 조합에 대해 이중 for문을 사용하여 모든 사용자를 탐색하면서, 각 이모티콘의 할인된 가격을 계산하고, 사용자의 구매 금액과 비교하여 서비스 가입 여부를 확인했습니다. 이 과정에서 해당 사용자의 서비스 가입을 원하는 가격보다 현재 구매 가격이 높아지면 서비스를 구매하는 방식으로 서비스 가입 여부를 확인할 수 있었습니다. 그 후, 최종적으로 if문으로 가장 서비스 가입 자가 많고 판매 금액이 많은 경우를 구할 수 있었습니다.
이렇게 Python과 Java로 프로그래머스의 할인 행사 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊