본문 바로가기

개발/algorithm

[프로그래머스][level2] 이모티콘 할인 행사 - python

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 

- 완전 탐색 문제

users와 emoticons의 최대 길이가 그렇게 크지 않으므로, 완전 탐색으로 접근 

중복순열 라이브러리를 사용해서 간단하게 풀었다. 

이모티콘의 할인율이 10, 20, 30, 40 중 하나이므로 중복 순열로 가능한 이모티콘들의 할인율의 조합들을 구한 후, 

각 케이스 별 이모티콘 플러스 가입자 수와 판매액을 구해주었다.  

from itertools import product

def solution(users, emoticons):
    answer = []
    sale = [10,20,30,40]
    # 중복 순열 
    products = list(product(sale, repeat= len(emoticons)))

    for pro in products:
    	# 사용자별 구매 금액 
        cost = [0] * len(users)
        # 이모티콘 판매액 
        total = 0
        
        # 각 이모티콘 별 사용자가 구매하는지 안하는지 
        for i in range(len(emoticons)):
            for j in range(len(users)):
            	# 할인율이 더 크면 
                if pro[i] >= users[j][0]:
                	# 구매 금액 갱신 
                    cost[j] += emoticons[i] - int(emoticons[i] * pro[i] * 0.01)
                    # 판매액 갱신 
                    total += emoticons[i] - int(emoticons[i] * pro[i] * 0.01)
        
		# 이모티콘 플러스 가입자 수 
        people = 0 
        
        for i in range(len(users)):
        	# 사용자가 지정한 금액보다 많이 구매했으면 
            if cost[i] >= users[i][1]:
				# 구매를 취소 
                total -= cost[i]
                # 이모티콘 플러스 가입 
                people += 1 

        answer.append([people, total])
	
    # 이모티콘 플러스 가입자 수와 판매액이 큰 순으로 정렬 
    answer.sort(reverse=True)
    
    return answer[0]