-
[Python] 프로그래머스 - 이모티콘 할인행사 - 중복순열, 완전탐색알고리즘 문제풀이/프로그래머스 2023. 6. 23. 19:20반응형
Lv2. 문제링크 2023 KAKAO BLIND RECRUITMENT
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📎알고리즘
먼저, 할인율이 [10,20,30,40]으로 한정되어 있고, 이모티콘 최대 개수가 7개인 것을 보아,
이건 완전탐색으로 풀어도 되겠구나 라는 생각이 들었다.모든 조합을 따져봐야하는데, 이모티콘의 index 순서에 따라 할인율 조합을 구해야 하므로, 중복 순열을 사용하면 된다.
itertools.product 라이브러리를 사용하면 정말 쉽게 중복조합 리스트를 얻을 수 있고, repeat=개수 를 통해 리스트의 길이를 정해주면 된다.
userSpent라는 함수를 따로 선언해 주어 인자로 할인율 중복조합의 한 가지 케이스를 넣어주면 그에 따라, 할인된 이모티콘들의 합을 반환해 주도록 했다. 그런데 문제에서 사용자의 기준보다 더 할인율이 높은 이모티콘만 산다고 했으니, if문으로 조건을 한번 더 걸어주었다.
그렇게 받아온 가격의 총합을 사용자 임티 플러스 구매 조건 금액이랑 비교해서 만약, 임티 산 총액이 조건 금액보다 높다면 이모티콘 플러스 한 사람 + 1 해주고, continue를 통해 이 금액은 전체 총합에 업데이트하지 않는다.(임티 플러스 결제하면 그 사람이 산 모든 이모티콘 결제 취소). 만약 임티 플러스를 살 금액이 되지 않는다면 쓴 돈만 total에 더해서 업데이트해준다.
이렇게 문제 출력조건대로 [임티플러스 결제한 사람 수, 총금액] 대로 answer 리스트에 추가해 줬으면 sorted 함수를 쓰면 자동으로 1번 조건, 2번 조건 순서대로 정렬해 주니까, 내림차순 정렬해서 0번째 원소를 리턴 값으로 지정하면 문제 조건에서 원하는 가장 큰 값이 튀어나오게 된다.
⌨코드
from itertools import product # 중복순열 def userSpent(emoticons, ratio, user_rate): # 유저가 조건을 만족해서 사는 이모티콘 총합 return sum([emoticons[i]*(1-(ratio[i]/100)) for i in range(len(emoticons)) if ratio[i]>=user_rate]) def solution(users, emoticons): answer=[] for ratio in product([10,20,30,40], repeat=len(emoticons)): emti_plus, total=0,0 for user in users: res=userSpent(emoticons, ratio, user[0]) if res >=user[1]: emti_plus+=1 continue total+=res answer.append([emti_plus,total]) return sorted(answer, reverse=True)[0]
💻제출결과
반응형'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 카카오 문제 - 택배 배달과 수거하기 - 그리디 (0) 2023.06.19 [Python] 프로그래머스 - 개인정보 수집 유효기간 - 구현 (2) 2023.06.16