머신러닝 개발자의 러닝머신

[2023KAKAO BLIND RECRUITMENT 이모티콘 할인행사]-Python 본문

알고리즘/프로그래머스

[2023KAKAO BLIND RECRUITMENT 이모티콘 할인행사]-Python

oongsong 2023. 4. 11. 22:04
반응형

 

문제 설명- 문제링크 

유형

완전탐색 

: 어떤 알고리즘으로 최적의 답을 찾을 수 있을 지 방법이 없음 & 이모티콘의 갯수가 최대 7개

  -> 완전탐색으로 모든 경우의 수 살펴보자

 

알아야 하는 것 

1. 중복순열 라이브러리 itertools.product

2. 대소비교 우선순위-> 원소들 배열에 넣고 (>, <, ==) 연산자로 구현 

 

풀이 아이디어

- 각 이모티콘마다 [10, 20, 30, 40] 할인율에 대해

  -> 중복순열로 각 이모티콘의 할인율 리스트에 대해 구독자 수, 판매금액 계산

- 각 케이스에 대해 모든 사람들의 구매 결제, 구독 여부 판단 

- answer < [구독자수, 판매금액] 이면 answer 갱신 

  -> 구독자 수, 판매금액 순차적으로 대소비교 가능 

 

코드 구현 

from itertools import product

def solution(users, emoticons):
    answer = [0, 0] #구독자 수, 판매금액 순으로 더 큰 값을 answer로 갱신하기 위해 0, 0으로 초기 세팅 
    n = len(users)
    m = len(emoticons)
    
    for emo_discount in product([10, 20, 30, 40], repeat = m): #각 이모티콘의 할인율 모든 경우에 대해
        subscribe, money = 0, 0 
        for [dis, th] in users: #각 사용자들의 구독여부, 결제 금액 계산
            tmp_money = 0 
            for i in range(m):
                if emo_discount[i]>=dis: #비율보다 큰 이모티콘 구매 
                    tmp_money += emoticons[i]*(1- emo_discount[i]/100) #할인율을 적용한 가격에 대해 지불 
            if tmp_money >=th: #해당 사람의 th보다 결제금액이 크면 구독
                subscribe += 1
            else: #그렇지 않으면 금액 결제 
                money += tmp_money 
        if answer<[subscribe, money]: #리스트 묶음으로 우선순위 순서대로 비교 가능 
            answer = [subscribe, money]
                    
    return answer

 

반응형