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

Annie Jeong·2023년 2월 26일
0

PS

목록 보기
1/1

문제

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

각 이모티콘에 10, 20, 30, 40 프로의 할인율을 적용할 수 있고, 유저의 [구매 기준 할인율, 가입 기준 가격] 리스트와 이모티콘의 가격 리스트가 주어질 때, 이모티콘 플러스 가입자가 가장 높은 경우 중 이모티콘 판매 매출이 가장 높은 경우의 [가입자 수, 매출]을 반환하는 문제

  • 알고리즘 분류 - 완전 탐색, 중복 조합
  • 난이도 - Level 2
  • 소요 시간 - 20~30분

관련 개념

중복 순열 - product()

from itertools import product
product(중복 순열을 구할 대상, repeat=중복 순열 길이)

접근 방법

할인율을 리스트로 만들어 이모티콘 별 할인율에 대한 중복조합을 구한 후, 완전탐색으로 중복조합의 각 경우에 대해 가입자 수와 매출을 구하고, 최대 가입자 수와 그 때의 최대 매출과 비교해 최대값을 업데이트 했다.

코드

+7

from itertools import product

def solution(users, emoticons):
    answer = []
    sale = [10, 20, 30, 40]
    max_mem = -1 # 최대 가입자 수
    max_profit = -1 # 가입자 수가 최대일 때의 최대 매출
    
    for sales in product(sale, repeat = len(emoticons)): # 중복 순열의 각 경우에 대해
        buy = {i:0 for i in range(len(users))} # {유저 인덱스: 이모티콘 구매 비용}
        members = 0
        
        for i in range(len(users)): # 각 유저에 대해 구매비용, 가입여부 도출
            th_sale = users[i][0]
            th_price = users[i][1]
            for j in range(len(sales)):
                if sales[j] >= th_sale:
                    buy[i] += emoticons[j] * (100-sales[j]) // 100
                if buy[i] >= th_price:
                    buy[i] = 0
                    members += 1
                    break
		
        if members > max_mem: # 최대 가입자 수가 갱신되었으면
            max_mem = members
            max_profit = sum(buy.values()) # 최대 매출 갱신
        if members == max_mem: # 최대 가입자 수가 동일하면
            max_profit = max(sum(buy.values()), max_profit) # 기존 최대 매출과 신규 최대 매출 중 큰 값으로 최대 매출 갱신
            
        
    return [max_mem, max_profit]
profile
감자 탈출기🥔

0개의 댓글