본문 바로가기
코테 공부 🔥

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

by 서니서닝 2023. 5. 13.
728x90

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

 

프로그래머스

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

programmers.co.kr

문제 요약 : n명의 카카오톡 사용자들에게 이모티콘 m개를 할인하여 판매한다. 이모티콘의 할인율은 10%, 20%, 30%, 40% 중 하나로 설정되며, 사용자들은 각자의 기준에 따라 이모티콘을 구매한다. (기준은 할인율과 돈)

1. 이모티콘 플러스 가입자를 최대한 늘리고, 2. 판매액을 최대한 늘리는 경우, 각각의 값들을 출력하라.

 

입출력 예시

 

📌 풀이 )

문제를 이해하는 데에 시간이 꽤 걸린 것 같다.😅

처음에 이모티콘 할인율이 모두 동일하게 적용되는 줄 알고, 삽질을 엄청 했다.

 

이모티콘마다 할인율이 다를 수 있으며, 각각의 확률을 구해줘야한다.

할인율은 총 4가지이고, 이모티콘의 개수 최대 값은 7이기 때문에 완전 탐색도 오케이! 라는 힌트를 보고 감을 잡았다..

 

combinations는 많이 사용해봤는데, 중복순열은 또 처음 사용해봤다.

해당 내용은 향후 정리할 예정,,

일단 잘 정리한 내용이 있어서 링크를 걸어둔다.

 

product는 데카르트 곱이라고도 하는 cartesian product를 표한할 때 사용하는 메소드이다.

두개 이상의 리스트의 모든 조합을 구할 때 사용된다. 중복 순열이기 때문에 순서가 있고, 중복도 허용된다.

 

가장 우선으로 해야하는 것은 이모티콘 플러스 가입시키기이고, 그 다음이 총 판매금액이다.

 

  1. product로 중복순열 경우의 수를 구한다.
  2. 경우의 수를 for문 돌린다.
    1. user의 할인율과 비교하여 높거나 같으면 구매를 한다.
    2. 만일, paid(사용한 돈)가 더 크면, 사용자는 이모티콘 플러스를 산다.
    3. 그렇지 않으면, buyTotal에 구매비용을 추가한다.
    4. 나머지 user들도 마찬가지로 계산한다.
  3.  emotiPlus와 totalPaid를 비교하여 값을 갱신해준다.
  4. 가장 우선순위에 적합한 값들을 출력한다.
from itertools import product

def solution(users, emoticons):
    emotiPlus = 0
    totalPaid = 0
    discounts = product([10,20,30,40],repeat=len(emoticons))
    
    for discount in discounts:  # 경우의 수
        buyPlus = 0
        buyTotal = 0

        for user in users:
            paid = 0
            
            for i in range(len(emoticons)):
                if(discount[i] >= user[0]): # 할인이 사용자의 기준보다 높거나 같음(산다)
                    paid += emoticons[i] * (1 - discount[i]/100)                 
            
            if(paid >= user[1]):    # 지불한 값이 가진 돈보다 크면
                buyPlus += 1
            else:   # 전체 구매비용 추가
                buyTotal += paid

        if(emotiPlus < buyPlus):    # 이모티콘 플러스 가입횟수가 더 많아짐, 갱신
            emotiPlus = buyPlus
            totalPaid = buyTotal
            
        elif (emotiPlus == buyPlus):  # 플러스 가입횟수 같을때, 돈 더 많이 벌었으면 갱신
            if buyTotal > totalPaid :
                totalPaid = buyTotal
    
    return [emotiPlus, totalPaid]
728x90

댓글