본문 바로가기

프로그래머스 퀴즈(Python)/level 2

23.02.16 파이썬 코딩 퀴즈#158 이모티콘 할인행사 (프로그래머스 스쿨)

이번 문제는 이모티콘 할인행사 문제이다.

문제의 핵심은 이모티콘 플러스 서비스 가입자를 최대한 늘리면서 이모티콘 판매액을 최대한 늘리는 것이다.

일단 조건을 알아보자.

판매되는 이모티콘의 할인율은 10%, 20%, 30%, 40% 중 하나로 설정된다.

각 사용자들마다 기준은 다르지만 일정 비율 이상 할인하는 이모티콘을 모두 구매한다.

이 때, 사용자들이 이모티콘을 구매한 비용의 합이 일정 가격 이상이 된다면, 해당 구매내역을 모두 취소하고 이모티콘 플러스 서비스에 가입한다.

위 예시처럼 2명의 사용자가 있고, 각 40%, 25% 의 할인이 적용되면 이모티콘을 구매한다. 또한 이모티콘 플러스 서비스 가입 기준은 둘다 10,000 원 이다.

먼저 두 이모티콘을 모두 40% 할인하게 되면, 두가지 이모티콘을 모두 판매할 수 있지만 서비스 가입자는 0명이다, 그리고 이 때 판매액은 19,200 원이 된다.

1번 이모티콘은 30%, 2번 이모티콘을 40$ 할인하게 되면, 1번 사용자는 2번만 구매하게 되고, 2번 사용자는 1,2 번 모두 구매하게 된다. 2번 사용자의 누적 구매 비용인 10,000원을 넘었기에 해당 사용자의 구매는 모두 취소되고 이모티콘 플러스 서비스에 가입하게 된다. 즉 서비스 가입자 1명, 판매액은 5,400 원 이다.

위 표에서 알 수 있듯이 두 제품 모두를 30% 할인하게 되면, 2번 사용자의 누적 구매 금액은 11,200 원이다. 따라서 서비스 가입이 가능한데, 이 때 1번은 아무런 상품도 구매하지 않기 때문에 판매액은 0원이 된다.

따라서 해당 문제에서 가장 먼저 찾아야할 부분은 서비스 가입 기준을 아슬아슬하게 통과 시키는 할인율이다.

할인율을 구하기 위해 itertools 라이브러리를 사용하였다.

먼저 세일 기준이 되는 sale 을 선언해 주고, 해당 sale를 이모티콘의 길이만큼 원소가 중복되어 만들어 질 수 있도록 product()를 사용하여 조합해 주었다. 

이제 반복문을 통해서 users를 돌면서 해당 comb 를 적용시켜 누적금액을 계산한다.

최종적으로 나온 누적금앤 bought 를 서비스 가입 기준과 비교하여, 만약 가입기준에 충족한다면 join_pay[0]의 값을 1 증가 시켜주고, 아니라면 join_pay[1] 에 누적금액을 더해준다.

이 방식이 통하는 이유는 바로 이모티콘의 최대 개수가 7개이기 때문이다. 할인율 4종류를 7제곱만큼 해주어도 16384개의 경우가 생기기 때문에 시간초과에 걸릴 위험도 없다.