https://school.programmers.co.kr/learn/courses/30/lessons/150368
모든 경우의 수를 구한다.
만약 이모티콘 수가 2개라면 가능한 할인율 경우는 [[10, 10], [10, 20], [10, 30], [10, 40], [20, 10], [20, 20], [20, 30], [20, 40], [30, 10], [30, 20], [30, 30], [30, 40], [40, 10], [40, 20], [40, 30], [40, 40]]이 될 것이다.
이렇게 이모티콘 수 대로 나올 수 있는 경우의 수를 구하는 함수이다.
구한 이모티콘 할인율 case별로 계산한다.
문제에서 이모티콘 할인율은 user의 비율보다 항상 크거나 같아야지 이모티콘을 구매할 수 있다. 또한 이모티콘을 구매한 총합이 user의 가격보다 크다면 서비스가입을 할 수 있고 이모티콘을 구매한 총합이 user의 가격보다 작다면 서비스가입을 못하는 대신 이익이 늘어난다.
def solution(users, emoticons):
cases = []
def dfs(cnt, arr):
if cnt == len(emoticons):
cases.append(arr)
return
for i in range(1, 5):
tmp = arr.copy()
tmp.append(i*10)
dfs(cnt + 1, tmp)
dfs(0, [])
answer = [0,0]
for case in cases:
member_cnt = 0 ## 이모티콘 플러스 서비스 가입자
profit = 0 ##이익
for user in users:
total = 0 ## user의 총합
for i in range(len(case)):
if user[0] <= case[i]: ## 유저의 비율이 할인율보다 작다면
total += emoticons[i]*((100 - case[i]) / 100)
if total >= user[1]: ##user의 총합이 가격보다 크다면 서비스가입
member_cnt += 1
break
if i == len(case) - 1: ##이모티콘을 다 사도 가격보다 작다면 이익에 더한다.
profit += total
if answer[0] < member_cnt:
answer = [member_cnt, profit]
continue
elif answer[0] == member_cnt:
if answer[1] < profit:
answer = [member_cnt,profit]
return answer