본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv2. 이모티콘 할인행사(Python)

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

이모티콘 할인 행사의 목표

1. 이모티콘 플러스 서비스 가입자를 최대한 늘리자

2. 이모티콘 판매액을 최대한 늘리자 

 

이모티콘 할인율 미정 => 각 사용자마다 어떤 이모티콘들을 사용할지도 미정

할인율 증가 => 구매 인원 증가 => 구매 비용 증가 => 서비스 가입 증가(목표1)

 

 

어떤 알고리즘?..? 완전탐색을 하는 경우 최대 사용자 100명, 최대 이모티콘 7개, 할인율은 4종류

=> 4^7 * 100 = 160만..?

 

코드
from itertools import product   # 순열 라이브러리 호출 

def solution(users, emoticons):
    answer = [0, 0] 
    
    emti_len = len(emoticons)
    user_len = len(users)
    
    max_subscriber = 0  # 최대 구독자 수(목표1)
    max_profit = 0  # 최대 이익(목표2)
    
    emti_discount = []  # 40, 30, 20, 10%의 할인을 적용한 가격을 미리 계산해 저장해 놓을 리스트 
    
    # 만약 이모티콘의 가격이 [100, 200, 300]이면
    for i in emoticons:
        discount_row = []   # 할인율 별 가격을 저장할 리스트
        for j in range(9, 5, -1):  
            discount_price = i * j // 10    # 해당 이모티콘의 할인된 가격 계산
            discount_row.append(discount_price) 
        emti_discount.append(discount_row)
    # 출력은 [[90, 80, 70, 60], [180, 160, 140, 120], [270, 240, 210, 180]]
            
    for discounts in product([40, 30, 20, 10], repeat = emti_len):  # 가능한 조합은 4^(emti_len)
        subscriber = 0  # 구독자 수 누적할 변수 
        profit = 0  # 이익 누적할 변수 
        
        for user in users:  # 각 사용자마다 반복
            user_profit = 0
            
            for i in range(emti_len):   # 이모티콘의 길이만큼 반복 
                if discounts[i] >= user[0]: # 할인율이 사용자의 구매 허용 비율보다 높다면 누적
                    user_profit += emti_discount[i][discounts[i] //10-1]    # 인덱스 매핑
                
            if user_profit >= user[1]:  # 구매한 이모티콘들의 가격의 합이 이용료보다 크거나 같으면 
                subscriber += 1 # 구독자로 간주 
            else:   # 그렇지 않으면 profit에 누적
                profit += user_profit
                
        answer = max(answer, [subscriber, profit])   
    
    return answer