[programmers] lv.2 이모티콘 할인행사

jeongjeong2·2023년 4월 4일
0

For coding test

목록 보기
32/59

문제 바로가기

문제 접근

  • 가입자 수가 큰 것을 우선으로 그 다음에 판매익을 비교한다 >> 가입자 수가 같을 경우만 판매수익을 비교해서 업데이트 시킨다
  • user의 제한이 100명, emoticon의 수가 7개로 한정되어있다 >> 할인율은 10,20,30,40으로 정해져 있으므로 emoticon을 할인하는 경우의 수는 최대 4^7으로 모든 case에 대해 판별해도 시간 초과가 나지 않을 거라 생각
  • 중복조합(from itertools import product)을 이용해서 모든 case를 구했다 (코드의 discount_cases)

정답 코드

from itertools import product #중복순열 이용해서 discounts 정의
def discount_cases(t):
    cases = []
    for i in product([40,30,20,10], repeat=len(t)):
        cases.append(i)
    return cases
def solution(users, emoticons):
    answer = [0,0]
    for case in discount_cases(emoticons): #case는 [o,o,o,o]꼴
        cnt = 0
        rev = 0
        #print('case>>',case)
        for dis,lim in users: # 40%이상, 10000이하일 경우인 user1
            total = 0
            for i in enumerate(case):
                if i[1]>=dis:
                    total += emoticons[i[0]]*(100-i[1])/100
            #print('total>>>',total)
            if total>=lim: # limit금액보다 크거나 같으면
                cnt += 1 #이모티콘 플러스 구매
            else: # limit보다 작으면
                rev += total #이모티콘 구매
        #print('cnt :',cnt, 'rev :',rev)
        if cnt>answer[0]: #구매자 수 비교, 더 크면
            answer[0] = cnt 
            answer[1] = rev
        if cnt == answer[0] and rev>answer[1]:
            answer[1] = rev
    return answer

itertools를 이용한 순열, 조합

from itertools import permutations #순열
from itertools import product #중복순열
from itertools import combinations #조합
from itertools import combinations_with_replacement #중복조합

구현 예시

for i in product([1,2,3], repeat=2): 
#[]에는 서로 다른 n개, repeat은 길이

0개의 댓글