알고리즘 공부/코딩테스트(프로그래머스)

[프로그래머스 Level 2] 이모티콘 할인행사 (Python 파이썬) 풀이 방법

yepppi 2023. 1. 6. 17:47
반응형
SMALL

오늘 풀 문제는 2023 KAKAO BLIND RECRUITMENT 의 이모티콘 할인행사로 정했다. 카카오 코딩테스트라 함은 ... 어렵다는 생각이 들기 마련인데, 나 또한 지레 겁먹고 포기하려다가 끝까지 풀어보게 되었다. 벌써 많은 분들이 문제를 푸셨던데 대단하시다...!

 

 

 

프로그래머스 <이모티콘 할인행사> 문제 보기

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

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스 <이모티콘 할인행사> 문제 풀이

import math
from itertools import product
def solution(users, emoticons):
    answer = []
    rates = [10, 20, 30, 40]
    
    rates = list(product(rates, repeat = len(emoticons)))
    
    for rate in rates:
        check = [0, 0]
        for user in users:
            price = 0
            for each in range(len(rate)):
                if user[0] > rate[each]:
                    continue
                else:
                    price += math.ceil(emoticons[each]*(100-rate[each])/100)
            if price >= user[1]:
                check[0] += 1
            else:
                check[1] += price
        answer.append(check)
    
    answer = sorted(answer, key = lambda x: (-x[0], -x[1]))
    
    return answer[0]

결국 완전탐색(브루트 포스)으로 모든 경우를 따져봐야 하는 문제였다. 할인율이 4가지고, 이모티콘의 최대 개수는 7개이기 때문에 많아봐야 4^7개의 경우만 봐주면 된다.

 

이 문제의 포인트는 다음과 같다.

1. itertools의 product를 사용하여 각 이모티콘이 할인되는 할인율(rates (10, 20, 30, 40))의 경우의 수를 모두 구해주었다.

2. check = [0, 0] 를 두어 rates 하나를 돌 때마다 [이모티콘 플러스에 가입하는 사람 수, 판매액] 을 구해준 후 answer 리스트에 전부 넣어주었다. (* 이때 주의할 점은, 만약 user가 설정한 할인율보다 이모티콘 할인율이 낮을 경우 continue를 통해 경우를 세지 않고, 그렇지 않을 경우에 구매하게 되는 금액을 price에 저장해주었다가 해당 user가 정해둔 금액을 넘었을 시 이모티콘 플러스를 구입한 수 증가, 그렇지 않다면 판매액에 더해주는 로직인 것이다.) >> 나는 이 부분을 고민하는데 오랜 시간이 걸렸다...

3. 이후 answer 리스트를 이모티콘 플러스 가입자 수 순 >> 판매액 순 으로 내림차순 정렬하여 가장 앞에 있는 리스트를 반환하도록 하였다.

 

 

 

오늘 머리가 정말 안 돌아가는 날이었는데... 이 문제를 풀게 되었다. 그래서 문제를 이해하고 로직을 구현하는데 정말 오랜 시간이 걸렸던 것 같다. (오히려 카카오 문제에 겁을 더 먹게 되었달까...) 2023 KAKAO BLIND RECRUITMENT 후기를 찾아봤는데 역시나 이건 쉬운 문제였다 ㅠㅠ 3-40분 정도 걸려서 푸신 분들이 많은 것 같은데 나는 1시간정도 혹은 그 이상 걸린 것 같다. 오늘은 시간이 없어서 알고리즘 문제를 하나도 풀지 못할 뻔했는데 그래도 하나라도 풀었으니 다행인 것 같다. 아직 1일 1코테, 1일 1블로그, 1일 1커밋을 잘 실천 중이다 :)

반응형
LIST