https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 접근
이모티콘 할인 행사의 목표
1. 이모티콘 플러스 서비스 가입자를 최대한 늘리자
2. 이모티콘 판매액을 최대한 늘리자
이모티콘 할인율 미정 => 각 사용자마다 어떤 이모티콘들을 사용할지도 미정
할인율 증가 => 구매 인원 증가 => 구매 비용 증가 => 서비스 가입 증가(목표1)
어떤 알고리즘?..? 완전탐색을 하는 경우 최대 사용자 100명, 최대 이모티콘 7개, 할인율은 4종류
=> 4^7 * 100 = 160만..?
코드
from itertools import product # 순열 라이브러리 호출
def solution(users, emoticons):
answer = [0, 0]
emti_len = len(emoticons)
user_len = len(users)
max_subscriber = 0 # 최대 구독자 수(목표1)
max_profit = 0 # 최대 이익(목표2)
emti_discount = [] # 40, 30, 20, 10%의 할인을 적용한 가격을 미리 계산해 저장해 놓을 리스트
# 만약 이모티콘의 가격이 [100, 200, 300]이면
for i in emoticons:
discount_row = [] # 할인율 별 가격을 저장할 리스트
for j in range(9, 5, -1):
discount_price = i * j // 10 # 해당 이모티콘의 할인된 가격 계산
discount_row.append(discount_price)
emti_discount.append(discount_row)
# 출력은 [[90, 80, 70, 60], [180, 160, 140, 120], [270, 240, 210, 180]]
for discounts in product([40, 30, 20, 10], repeat = emti_len): # 가능한 조합은 4^(emti_len)
subscriber = 0 # 구독자 수 누적할 변수
profit = 0 # 이익 누적할 변수
for user in users: # 각 사용자마다 반복
user_profit = 0
for i in range(emti_len): # 이모티콘의 길이만큼 반복
if discounts[i] >= user[0]: # 할인율이 사용자의 구매 허용 비율보다 높다면 누적
user_profit += emti_discount[i][discounts[i] //10-1] # 인덱스 매핑
if user_profit >= user[1]: # 구매한 이모티콘들의 가격의 합이 이용료보다 크거나 같으면
subscriber += 1 # 구독자로 간주
else: # 그렇지 않으면 profit에 누적
profit += user_profit
answer = max(answer, [subscriber, profit])
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]Lv1. 가장 많이 받은 선물(Python) (0) | 2024.02.11 |
---|---|
[프로그래머스]Lv2. 리코쳇 로봇(Python) (0) | 2024.02.09 |
[프로그래머스]Lv2. 요격 시스템(Python) (0) | 2024.02.05 |
[프로그래머스]Lv2. 연속된 부분 수열의 합(Python) (0) | 2024.02.04 |
[프로그래머스]Lv2. 숫자 변환하기(Python) (0) | 2024.02.03 |