[프로그래머스] 이모티콘 할인행사 파이썬 풀이

2024. 10. 8. 23:06알고리즘

※ 사용언어 : 파이썬 ※

 

▼ 문제 링크 ▼

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

 


 

문제 접근

◇ 이모티콘 할인 행사가 시작된다. 이번 행사에서 사용자는 다음과 같은 조건에서 이모티콘을 구매합니다.

1. 자신이 설정한 비율보다 높은 비율로 할인하는 이모티콘을 모두 구매

2. 이모티콘의 구매금액이 자신이 설정한 금액보다 높은 경우 이모티콘 플러스를 구매.

 

◇ 해당 문제의 최종 목표는 다음과 같습니다.

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

2. 이모티콘 판매액을 최대한 늘릴 것.

 

◇ 추가적으로 할인율은 10% 20% 30% 40%로 고정되어 있습니다.

 

◇ 최대 사용자 수는 100명이며, 이모티콘도 최대 7개이기 때문에 각 이모티콘이 가질 수 있는 할인율을 전부 찾아 계산하는 완전탐색을 사용해서 풀 수 있습니다.

 


 

문제풀이 (With Python)

import heapq
from itertools import product

def solution(users, emoticons):
    discount_rate = [10,20,30,40]
    # 각 이모티콘에게 적용할
    # 할인율 쌍 구하기
    candidate = list(product(discount_rate, repeat=len(emoticons)))
	
    # 할인율쌍이 적용된 이모티콘 가격을
    # 사전에 계산
    new_emoticons_price = []
    for candi in candidate:
        temp = []
        for rate, price in zip(candi, emoticons):
            temp.append(price * (100-rate) * 0.01)
        new_emoticons_price.append(temp)
	
    answer = []
    for i in range(len(new_emoticons_price)):
    	# 해당 할인율 쌍에서
        # 발생한 모든 유저의 이모티콘 구매 비용
        all_user_total = 0
        # 발생한 플러스 구독자 수
        plus = 0
        for j in range(len(users)):
            percent = users[j][0]
            max_price = users[j][1]
            # 현재 유저의 이모티콘 구매 비용
            user_total = 0
            flag = False
            for k in range(len(new_emoticons_price[i])):
            # 할인율 후보쌍과 이모티콘 새 가격 리스트는
            # index이 동일함
                if not flag and candidate[i][k] >= percent:
                        user_total += new_emoticons_price[i][k]
						# 총 금액이 기준가격을 넘겼나?
                        if user_total >= max_price:
                            plus += 1
                            user_total = 0
                            flag = True
                        else:
                        	# 넘겨서 flag가 true면
                            # 더 계산할 필요없으니 pass
                            pass
            # pass후 여기로 넘어옴
            # flag = 플러스 구독
            # !flag = 플러스 구독 X
            if not flag:
                all_user_total += user_total
        # heapq를 통해 answer 배열을 자동 정렬
        # 이때 -를 곱해 최대 heapq로 생성
        # 조건 상 plus가 우선이니 plus를 앞에
        heapq.heappush(answer, (-plus, -all_user_total))

    return [-answer[0][0], int(-answer[0][1])]