728x90
https://school.programmers.co.kr/learn/courses/30/lessons/150368
문제 요약 : n명의 카카오톡 사용자들에게 이모티콘 m개를 할인하여 판매한다. 이모티콘의 할인율은 10%, 20%, 30%, 40% 중 하나로 설정되며, 사용자들은 각자의 기준에 따라 이모티콘을 구매한다. (기준은 할인율과 돈)
1. 이모티콘 플러스 가입자를 최대한 늘리고, 2. 판매액을 최대한 늘리는 경우, 각각의 값들을 출력하라.
입출력 예시
📌 풀이 )
문제를 이해하는 데에 시간이 꽤 걸린 것 같다.😅
처음에 이모티콘 할인율이 모두 동일하게 적용되는 줄 알고, 삽질을 엄청 했다.
이모티콘마다 할인율이 다를 수 있으며, 각각의 확률을 구해줘야한다.
할인율은 총 4가지이고, 이모티콘의 개수 최대 값은 7이기 때문에 완전 탐색도 오케이! 라는 힌트를 보고 감을 잡았다..
combinations는 많이 사용해봤는데, 중복순열은 또 처음 사용해봤다.
해당 내용은 향후 정리할 예정,,
일단 잘 정리한 내용이 있어서 링크를 걸어둔다.
product는 데카르트 곱이라고도 하는 cartesian product를 표한할 때 사용하는 메소드이다.
두개 이상의 리스트의 모든 조합을 구할 때 사용된다. 중복 순열이기 때문에 순서가 있고, 중복도 허용된다.
가장 우선으로 해야하는 것은 이모티콘 플러스 가입시키기이고, 그 다음이 총 판매금액이다.
- product로 중복순열 경우의 수를 구한다.
- 경우의 수를 for문 돌린다.
- user의 할인율과 비교하여 높거나 같으면 구매를 한다.
- 만일, paid(사용한 돈)가 더 크면, 사용자는 이모티콘 플러스를 산다.
- 그렇지 않으면, buyTotal에 구매비용을 추가한다.
- 나머지 user들도 마찬가지로 계산한다.
- emotiPlus와 totalPaid를 비교하여 값을 갱신해준다.
- 가장 우선순위에 적합한 값들을 출력한다.
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
'코테 공부 🔥' 카테고리의 다른 글
[백준/파이썬] 3020: 개똥벌레 (1) | 2023.05.18 |
---|---|
[백준/파이썬] 16946: 벽 부수고 이동하기 4 (0) | 2023.05.15 |
[백준/파이썬] 16724: 피리 부는 사나이 (0) | 2023.05.01 |
[백준/파이썬] 14578: 영훈이의 색칠공부 (0) | 2023.05.01 |
[백준/파이썬] 1043: 거짓말 (0) | 2023.05.01 |
댓글