본문 바로가기
프로그래머스/Lv.2

2023 KAKAO BLIND RECRUITMENT > 이모티콘 할인행사 - Python, product, 조합

by 아찌방 2024. 11. 23.

 

 

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