https://school.programmers.co.kr/learn/courses/30/lessons/150368
풀이 - 나의 생각
처음에는 조합으로 해결하려고 했다.
알아보니 파이썬에서는
itertools.product
를 통해 조합을 쉽게 해결할 수 있었다.
itertools.product를 사용해서
이모티콘의 가격을 10, 20, 30, 40퍼센트 할인하는 경우의 수를 구하고
이를 돌려가면서 조건에 맞는지 체크한다.
근데 그때마다 할인율에 맞는 금액을 구하는 건
비효율적이라고 생각했다.
그래서 이모티콘의 가격을 할인율에 맞게 구한 후
계산할때는 뽑아오기만 했다.
코드
from itertools import product
def solution(users, emoticons):
discounts = [10, 20, 30, 40]
n, m = len(users), len(emoticons)
max_subscribers, max_sales = 0, 0
# 이모티콘 할인 가격 미리 계산
discounted_prices = []
for price in emoticons:
discounted_prices.append([price * (1 - d / 100) for d in discounts])
# 할인율 조합 생성
discount_combinations = list(product(range(4), repeat=m))
# 모든 할인율 조합에 대해 계산
for discount_combo in discount_combinations:
subscribers = 0
total_sales = 0
for ratio, price in users:
user_spent = 0 # 해당 사용자가 구매한 총 금액
for idx, discount_index in enumerate(discount_combo):
if discounts[discount_index] >= ratio: # 사용자의 비율 조건을 만족하는 경우
user_spent += discounted_prices[idx][discount_index]
if user_spent >= price:
subscribers += 1
else:
total_sales += user_spent
# 조건 비교
if subscribers > max_subscribers or (subscribers == max_subscribers and total_sales > max_sales):
max_subscribers = subscribers
max_sales = total_sales
return [max_subscribers, int(max_sales)]
728x90
'프로그래머스 > Lv.2' 카테고리의 다른 글
연속된 부분 수열의 합 - Python, 부분합, 슬라이딩 윈도우 (0) | 2024.12.16 |
---|---|
2023 KAKAO BLIND RECRUITMENT > 택배 배달과 수거하기 - Pyton, 구현 (1) | 2024.12.09 |
더 맵게 - Python, heap (0) | 2024.11.16 |
프로세스 - Python, deque, sorted (1) | 2024.11.13 |
기능개발 - Pyton, Deque, Math.ceil (0) | 2024.11.13 |