프로그래머스/Lv.2
2023 KAKAO BLIND RECRUITMENT > 이모티콘 할인행사 - Python, product, 조합
아찌방
2024. 11. 23. 17:20
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 - 나의 생각
처음에는 조합으로 해결하려고 했다.
알아보니 파이썬에서는
itertools.product
를 통해 조합을 쉽게 해결할 수 있었다.
itertools.product를 사용해서
이모티콘의 가격을 10, 20, 30, 40퍼센트 할인하는 경우의 수를 구하고
이를 돌려가면서 조건에 맞는지 체크한다.
근데 그때마다 할인율에 맞는 금액을 구하는 건
비효율적이라고 생각했다.
그래서 이모티콘의 가격을 할인율에 맞게 구한 후
계산할때는 뽑아오기만 했다.
코드
from itertools import product
def solution(users, emoticons):
discounts = [10, 20, 30, 40]
n, m = len(users), len(emoticons)
max_subscribers, max_sales = 0, 0
# 이모티콘 할인 가격 미리 계산
discounted_prices = []
for price in emoticons:
discounted_prices.append([price * (1 - d / 100) for d in discounts])
# 할인율 조합 생성
discount_combinations = list(product(range(4), repeat=m))
# 모든 할인율 조합에 대해 계산
for discount_combo in discount_combinations:
subscribers = 0
total_sales = 0
for ratio, price in users:
user_spent = 0 # 해당 사용자가 구매한 총 금액
for idx, discount_index in enumerate(discount_combo):
if discounts[discount_index] >= ratio: # 사용자의 비율 조건을 만족하는 경우
user_spent += discounted_prices[idx][discount_index]
if user_spent >= price:
subscribers += 1
else:
total_sales += user_spent
# 조건 비교
if subscribers > max_subscribers or (subscribers == max_subscribers and total_sales > max_sales):
max_subscribers = subscribers
max_sales = total_sales
return [max_subscribers, int(max_sales)]
728x90