Computer Science/알고리즘

[프로그래머스 - Python] 150368 - 이모티콘 할인행사

바보1 2023. 10. 15. 15:09

0.  문제 링크

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/150368

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1.  풀이 방법

 

 

  1. 문제를 보고 어떤 알고리즘을 써야 할지 좀 고민을 했다.
  2. 결론적으로 BF를 사용했는데, 이유는 최대 유저는 100명, 최대 이모티콘은 7개, 할인율은 4개 이므로 약 160만이기 때문이다.
  3. 따라서 완전 탐색을 하기로 결정했고, itertools.product를 사용해서 해결했다.

2.  코드

 

 

# 할인율이 증가 -> 구매 인원 증가 -> 구매 비용 증가 -> 서비스 가입 증가
# 할인율이 더 증가 -> 구매 인원 증가 -> 하지만 구매 비용 감소 -> 서비스 가입 감소
# BF일 때 -> 4^7 * 100 = 160만

from itertools import product

def solution(users, emoticons):
    answer = [0, 0]
    
    l_em = len(emoticons)
    l_user = len(users)
    
    max_subscriber = 0
    max_profit = 0
    
    em_discount = [[i * j // 10 for i in range(9, 5, -1)] for j in emoticons]
    
    for discounts in product([40, 30, 20, 10], repeat = l_em):
        subscriber = 0
        profit = 0
        
        for user in users:
            user_profit = 0
            
            for i in range(l_em):
                if discounts[i] >= user[0]:     # 할인율이 유저의 구매 허용 비율보다 높다면
                    user_profit += em_discount[i][discounts[i] // 10 - 1]     # 할인된 금액을 넣음
                    
            if user_profit >= user[1]:
                subscriber += 1
            else:
                profit += user_profit
        
        answer = max(answer, [subscriber, profit])
    
    return answer

3.  마무리