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