2023 KAKAO BLIND RECRUITMENT - 150368. 이모티콘 할인행사
[Lv. 2]
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
우선, 문제를 다 읽자마자 확인한 것은-
"Brute-Force로 해결할 만 한가?" 였다.
이모티콘의 각 할인율은 10%, 20%, 30%, 40% 중 하나이고,
1 ≤
emoticons
의 길이 =m
≤ 7
에서 볼 수 있듯, 이모티콘이 최대 7개이므로, 7^4 = 2041가지 경우의 수 정도만 파악하면 된다.
각 경우의 수마다, user가 어떤 행동을 취하는지를 확인하는 것은 당연히 O(1)의 time complexity로 계산 가능하고,
뭐 user의 최대 수도 아래와 같이 100명이므로... Brute-Force로 구현해도 TLE가 뜨진 않겠다- 싶었던 문제.
1 ≤
users
의 길이 =n
≤ 100
대충 계산때려봐도 20만개정도가 max니까 뭐..
그럼 이제 구현을 잘 해봐야겠죠..?
import sys sys.setrecursionlimit(10000) def solution(users, emoticons): # 할인율의 중복조합 d = [10, 20, 30, 40] discounts = [] def p(arr, depth, l): if depth == l: discounts.append(arr) return for i in range(4): p(arr+[d[i]], depth+1, l) # 할인율 리스트 생성 p([], 0, len(emoticons)) # 최종 결과. answer = [0, 0] # 모든 할인율 리스트에 대해 모든 유저의 상황을 확인, 최적의 상황 탐색 for discount in discounts: # 각 할인율 리스트에 대한 총 이모티콘 플러스 가입 유저와 이모티콘 구매 비용 emo_plus = 0 emo_total = 0 for user in users: total = 0 # 각 유저에 대해 각 아이템의 할인율을 대조하여, 살 지 말 지 확인. for i in range(len(discount)): # 이모티콘의 할인율이 유저가 생각하던 비율보다 높다면 구매 if user[0] <= discount[i]: total += int(emoticons[i]*((100-discount[i]))/100) # 유저가 설정한 가격 이상일 시, 이모티콘 플러스 가입. 아니라면, 이모티콘 총 구매 비용에 합산. if total >= user[1]: emo_plus += 1 else: emo_total += total # 이모티콘 가입자가 더 많다면 무조건 값 대체 if answer[0] < emo_plus: answer = [emo_plus, emo_total] # 이모티콘 가입자가 이전과 같다면, 총 판매 비용이 높을 때만 값 대체 elif answer[0] == emo_plus: if answer[1] <= emo_total: answer = [emo_plus, emo_total] return answer