https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음 이 문제를 풀이할 때 전체 할인률을 [10, 20, 30, 40]으로 각각 지정하여 플러스 이용자가 가장 많은 할인률을 확인한 뒤, 그 범위 안에서 좁혀 나갈 생각을 하였다.
그러나 문제를 풀이하면서 전체의 결과를 다 확인해야 된다는 것을 확인하였다.
그래서 모든 할인률을 확인하기 위해 중복 순열을 사용하였다.
from itertools import product
def solution(users, emoticons):
# users : n명의 구매 기준을 담은 2차원 정수 배열 [비율, 가격]
# emoticons :m개의 정가를 담은 1차원 정수 배열
for i in users:
if i[0]%10 != 0:
i[0] = ((i[0] // 10) + 1)*10
sales = list(product([10, 20, 30, 40], repeat = len(emoticons)))
best_param = [0,0,0] #가장 값이 좋은 plus_user, sum_cost, sales값
for sale in sales:
plus_user = 0
sum_cost = 0
for user in users:
cost = 0
for j in range(len(emoticons)):
if user[0] <= sale[j]:
cost += (emoticons[j] * (1-(sale[j] / 100)) )
if user[1] <= cost:
plus_user += 1
cost = 0
sum_cost += cost
if (best_param[0] < plus_user):
best_param[0] = plus_user
best_param[1] = sum_cost
best_param[2] = sale
elif(best_param[0] == plus_user):
if (best_param[1] <= sum_cost):
best_param[1] = sum_cost
best_param[2] = sale
answer = [best_param[0], int(best_param[1])]
return answer
돌아가는 원리를 파악하고 싶다면 아래의 코드를 실행해 보기를 추천한다.
단 원리를 파악할 때 먼저 2명의 users를 확인하길 바란다.
from itertools import product
def solution(users, emoticons):
# users : n명의 구매 기준을 담은 2차원 정수 배열 [비율, 가격]
# emoticons :m개의 정가를 담은 1차원 정수 배열
for i in users:
if i[0]%10 != 0:
i[0] = ((i[0] // 10) + 1)*10
sales = list(product([10, 20, 30, 40], repeat = len(emoticons)))
print(sales)
best_param = [0,0,0] #가장 값이 좋은 plus_user, sum_cost, sales값
for sale in sales:
plus_user = 0
sum_cost = 0
print('sale =',sale)
for user in users:
cost = 0
for j in range(len(emoticons)):
if user[0] <= sale[j]:
cost += (emoticons[j] * (1-(sale[j] / 100)) )
print('cost =', cost)
if user[1] <= cost:
plus_user += 1
cost = 0
sum_cost += cost
if (best_param[0] < plus_user):
best_param[0] = plus_user
best_param[1] = sum_cost
best_param[2] = sale
elif(best_param[0] == plus_user):
if (best_param[1] <= sum_cost):
best_param[1] = sum_cost
best_param[2] = sale
print('플러스 이용자 =',plus_user, '최종금액 =',sum_cost)
print('result =', best_param[0], best_param[1])
print('='*30)
answer = [best_param[0], int(best_param[1])]
print('best_param =', best_param[2])
return answer
# users = [[40, 2900], [23, 10000], [11, 5200], [5, 5900], [40, 3100], [27, 9200], [32, 6900]]
# emoticons = [1300, 1500, 1600, 4900]
users = [[40, 10000], [25, 10000]]
emoticons = [7000, 9000]
print(solution(users, emoticons))
'<코딩테스트> > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] > PCCP 기출문제 2번 > 퍼즐 게임 챌린지 (0) | 2024.12.29 |
---|---|
[프로그래머스] 코딩테스트 연습 Lv2> 연습문제 > 롤케이크 자르기 (0) | 2024.11.03 |
[프로그래머스] > LV.2 > 타겟넘버 (0) | 2024.10.20 |
[프로그래머스] LV2 > 연습문제 > 뒤에 있는 큰 수 찾기 (0) | 2024.09.23 |
[프로그래머스] LV2 > 완전탐색 > 소수 찾기 (0) | 2024.09.12 |