이모티콘 할인행사

홍범선·2023년 4월 4일
0

프로그래머스

목록 보기
3/18

이모티콘 할인행사

https://school.programmers.co.kr/learn/courses/30/lessons/150368

문제

풀이

  1. 모든 경우의 수를 구한다.

    만약 이모티콘 수가 2개라면 가능한 할인율 경우는 [[10, 10], [10, 20], [10, 30], [10, 40], [20, 10], [20, 20], [20, 30], [20, 40], [30, 10], [30, 20], [30, 30], [30, 40], [40, 10], [40, 20], [40, 30], [40, 40]]이 될 것이다.
    이렇게 이모티콘 수 대로 나올 수 있는 경우의 수를 구하는 함수이다.

  2. 구한 이모티콘 할인율 case별로 계산한다.

문제에서 이모티콘 할인율은 user의 비율보다 항상 크거나 같아야지 이모티콘을 구매할 수 있다. 또한 이모티콘을 구매한 총합이 user의 가격보다 크다면 서비스가입을 할 수 있고 이모티콘을 구매한 총합이 user의 가격보다 작다면 서비스가입을 못하는 대신 이익이 늘어난다.

  1. 구한 case별 결과를 계산한다.

    가장 우선이 되야 하는 것은 서비스 가입자 수이다. 그리고 서비스 가입자 수가 같을 때에는 profit이 큰 값으로 설정한다.
def solution(users, emoticons):  
    cases = [] 
    
    def dfs(cnt, arr):
        if cnt == len(emoticons):
            cases.append(arr)
            return 
        
        for i in range(1, 5):
            tmp = arr.copy()
            tmp.append(i*10)
            dfs(cnt + 1, tmp)
    dfs(0, [])
    
    answer = [0,0]
    for case in cases:
        member_cnt = 0 ## 이모티콘 플러스 서비스 가입자
        profit = 0 ##이익
        for user in users:
            total = 0 ## user의 총합
            for i in range(len(case)):
                if user[0] <= case[i]:  ## 유저의 비율이 할인율보다 작다면               
                    total += emoticons[i]*((100 - case[i]) / 100)
            
                if total >= user[1]: ##user의 총합이 가격보다 크다면 서비스가입
                    member_cnt += 1
                    break
                if i == len(case) - 1: ##이모티콘을 다 사도 가격보다 작다면 이익에 더한다.
                    profit += total
        if answer[0] < member_cnt:
            answer = [member_cnt, profit]
            continue
        elif answer[0] == member_cnt:
            if answer[1] < profit:
                answer = [member_cnt,profit]
    return answer

결과

profile
알고리즘 정리 블로그입니다.

0개의 댓글