https://school.programmers.co.kr/learn/courses/30/lessons/150368
각 이모티콘에 10, 20, 30, 40 프로의 할인율을 적용할 수 있고, 유저의 [구매 기준 할인율, 가입 기준 가격] 리스트와 이모티콘의 가격 리스트가 주어질 때, 이모티콘 플러스 가입자가 가장 높은 경우 중 이모티콘 판매 매출이 가장 높은 경우의 [가입자 수, 매출]을 반환하는 문제
중복 순열 - product()
from itertools import product
product(중복 순열을 구할 대상, repeat=중복 순열 길이)
할인율을 리스트로 만들어 이모티콘 별 할인율에 대한 중복조합을 구한 후, 완전탐색으로 중복조합의 각 경우에 대해 가입자 수와 매출을 구하고, 최대 가입자 수와 그 때의 최대 매출과 비교해 최대값을 업데이트 했다.
+7
from itertools import product
def solution(users, emoticons):
answer = []
sale = [10, 20, 30, 40]
max_mem = -1 # 최대 가입자 수
max_profit = -1 # 가입자 수가 최대일 때의 최대 매출
for sales in product(sale, repeat = len(emoticons)): # 중복 순열의 각 경우에 대해
buy = {i:0 for i in range(len(users))} # {유저 인덱스: 이모티콘 구매 비용}
members = 0
for i in range(len(users)): # 각 유저에 대해 구매비용, 가입여부 도출
th_sale = users[i][0]
th_price = users[i][1]
for j in range(len(sales)):
if sales[j] >= th_sale:
buy[i] += emoticons[j] * (100-sales[j]) // 100
if buy[i] >= th_price:
buy[i] = 0
members += 1
break
if members > max_mem: # 최대 가입자 수가 갱신되었으면
max_mem = members
max_profit = sum(buy.values()) # 최대 매출 갱신
if members == max_mem: # 최대 가입자 수가 동일하면
max_profit = max(sum(buy.values()), max_profit) # 기존 최대 매출과 신규 최대 매출 중 큰 값으로 최대 매출 갱신
return [max_mem, max_profit]