영아일지

[프로그래머스] level 2 이모티콘 할인행사 본문

디지털/코딩테스트

[프로그래머스] level 2 이모티콘 할인행사

영아일지 2023. 6. 22. 04:15

코딩테스트 연습 - 이모티콘 할인행사 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

[내 풀이]

1. emoticon함수를 활용하여 각 이모티콘의 임의 할인율을 lst로 정리한다

2. 모든 사용자들의 기준 할인율, 기준 가격을 하나씩 비교하여 total_num, total_price에 저장해놓는다

3. emoticon함수에서 종료조건에 다다랐을 때 이모티콘 플러스 서비스 가입자가 가장 많으며, 그 후 판매액이 가장 많은 값을 mx_num, mx_price에 저장한 후 반환한다.

def solution(users, emoticons):
    global mx_num, mx_price
    mx_num, mx_price = 0, 0

    def user(lst): #모든 사용자의 플러스 서비스 가입자, 판매액
        total_num = 0
        total_price = 0
        for i in range(len(users)):
            pc = users[i][0] / 100
            pr = users[i][1]
            sm = 0
            for j in range(len(lst)):
                if pc <= lst[j][0]:
                    sm += lst[j][1]
            if sm >= pr:
                total_num += 1
            else:
                total_price += sm
        return total_num, total_price
    
    def emoticon(e, lst): #각 이모티콘의 할인율 케이스
        global mx_num, mx_price
        if e == len(emoticons):
            num, price = user(lst)
            if num > mx_num:
                mx_num = num
                mx_price = price
            if num == mx_num:
                if mx_price < price:
                    mx_price = price
            return
        for i in [0.1, 0.2, 0.3, 0.4]:
            emoticon(e + 1, lst + [[i, (1 - i) * emoticons[e]]])
    emoticon(0, [])
    return mx_num, int(mx_price)

 

 

그림을 안그려보고 풀려고 하니까 어느 부분을 먼저 해야할지에 대한 혼란이 있었다. 피치못할 상황이 아니라면 아는 것같더라도 종이로 한번 그려보자.

 

함수안에 재귀함수를 넣는 과정에서 global를 활용하는 방법을 배웠다!