이모티콘 할인 행사

최민수·2023년 3월 29일
0

알고리즘

목록 보기
43/94
from itertools import product

def solution(users, emoticons):
    answer = []
    firstMax, secMax = 0, 0
    
    # 완전 탐색 가능 (4^7)
    sales = [0.9, 0.8, 0.7, 0.6]
    salesComb = product(sales, repeat=len(emoticons))
    
    for comb in salesComb:
        firstCond, secCond = 0, 0
        for user in users:
            purchased = 0.0
            for idx, sale in enumerate(comb):
                if 100-100*sale >= user[0]:
                    purchased += emoticons[idx]*(sale*100)/100
            if purchased >= user[1]:
                firstCond += 1
            else:
                secCond += purchased
        
        if firstCond > firstMax:
            firstMax = firstCond
            secMax = secCond
        elif firstCond == firstMax:
            if secCond > secMax:
                secMax = secCond
    
    answer.append(firstMax)
    answer.append(secMax)
    
    return answer

처음 문제를 봤을때, 할인 종류가 4종류, 최대 이모티콘 개수는 7개.
그러니까 완전 탐색을 해도 4^7(즉, 2^14가지, 그리고 user 마다 각각 반복문을 돌려도 약 160만 가지) 넉넉하다고 판단했다.

그 생각은 쉬웠는데, 중복 순열을 구성하는 단계에서 고비였다. python에는 itertools에 proudct 라는 아주 고마운 함수가 존재했다. 이 함수를 이용해서 풀이했다.

두번째 고비는 자꾸 테스트 케이스 1개가 실패하는 문제였다.
로직이 틀린 것도 아닌데 테스트 케이스 1개만 실패한다? 이것은 상당한 엣지 케이스거나 계산할 때 floating point 오차범위로 인해 미세하게 값이 빗나가는 경우 밖에 없다.

그런 생각으로 소수점을 곱하고 나누는 의심스러운 부분을 풀어서 쓰니 통과했다.


문제 출처: 프로그래머스 연습문제, https://school.programmers.co.kr/learn/courses/30/lessons/150368

profile
CS, 개발 공부기록 🌱

0개의 댓글