코딩테스트 대비/프로그래머스
프로그래머스 이모티콘할인행사
JellyApple
2023. 11. 7. 12:37
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 풀이
문제 풀이는 떠오르는데 막상 코드로 작성하기가 어렵다..꾸준히 보는 것만이 답인 것같다.. 그래도 점점 문제를 보면서 어떤 식으로 접근 할 지 떠오르는 점에 의의를 두고자 한다. 이번 문제는 카카오 문제였는데 아래처럼 접근하고자 했다.
1) 먼저 할인율을 10, 20 , 30 ,40% 로 나누고 이를 적용한 할인가격을 비교하려 했다.
=> 할인 가격을 비교하는 것보다 먼저 조합으로 랜덤한 할인율 조합을 지정하는 것이 더 좋은 방안 인 것 같다.
2) 할인율 조합 만든 후 유저 기준 할인율과 비교 후에 기준보다 작으면 할인된 가격을 구매 금액으로 해준다.
3) 만약 2) 과정에서 기준보다 큰 경우에는 이모티콘 플러스를 구독하기 때문에 구독 +1 해준다.
4) 반복문 돌리면서 기존 값보다 더 판매액이 크거나 구독자 수가 더 많다면 업데이트 해줘야 하기 때문에 예외 처리를 해준다.
2. 정답 코드
from itertools import product # 순열, 조합 관련 파이썬 라이브러리
def solution(users, emoticons):
len_emo = len(emoticons) # 이모티콘의 길이
len_user = len(users) # 유저 수
sale_rate = [10, 20, 30, 40] # 할인율 모아둔 것
answer= [0,0] # answer[0] = 이모티콘 플러스 구독 유저 수 answer[1] = 이모티콘 판매액
for sale in product(sale_rate, repeat=len_emo): # 이모티콘 가격에 10%~40%까지 무작위 조합으로 할인율 조합
count = 0 # 구독 수 표현할 변수 선언
money = 0 # 이모티콘 판매액 표현할 변수 선언
for i in range(len_user): # 유저 수 만큼 반복
user_sale = users[i][0] # 유저가 살 수 있는 할인율
sum = 0 # 총 구매액 (판매액) 선언할 변수
for j in range(len(sale)): # 할인된 이모티콘(새로운 값) 길이만큼 반복
if(user_sale<= sale[j]): # 만약 유저가 살 수 있는 할인율이 지금 할인율보다 작거나 같다면
sum += emoticons[j] * (100 - sale[j]) / 100 # emoticons에 할인율 적용한 값 더하기(판매액)
if sum >= users[i][1]: # 만약 이 판매액이 users의 구독 기준 금액보다 높다면
count += 1 # 이모티콘 플러스 구독
else: # 높지 않다면 그냥 판매액 money로 넘겨줌
money += sum
if answer[0] > count: # 만약 현재 구독자 수(count)가 기존 구독자 수(answer) 보다 적다면 다음 계산 하게 함
continue
if answer[0] == count and answer[1] > money: # 만약 구독자수는 같은데 판매액이 더 적다면 다음 계산하게 해서 예외처리 해줌
continue
answer= [count, money]
return answer
3. 피드백
파이썬에서 순열과 조합에 관한 라이브러리가 있는 itertools에 대해 배웠다.
그 중 product에 대해 배웠는데 이는 무작위 조합을 구현하고자 할 때 쓰인다.
for i in product([10,20], repeat=3): # 10,20으로 만들 수 있는 모든 가능한 3개의 요소 반환
print(i)
###
(10, 10, 10)
(10, 10, 20)
(10, 20, 10)
(10, 20, 20)
(20, 10, 10)
(20, 10, 20)
(20, 20, 10)
(20, 20, 20)
###