[Python] 다단계 칫솔 판매 - Lv.3

Saemi Min·2023년 3월 17일
0

Programmers Algorithm

목록 보기
28/29
post-thumbnail

문제 - 2021 Dev-Matching: 웹 백엔드 개발자(상반기)

해당 문제 링크


정답

def solution(enroll, referral, seller, amount):
    
    money = dict((e, 0) for e in enroll)
    head = dict((e, r) for e, r in zip(enroll, referral))

    for name, m in zip(seller, amount):
        price = 100*m
        
        while True:
            if name =="-" or price <=0:
                break
            next_money = int(price *0.1)
            money[name] += price - next_money
            
            name = head[name]
            price = next_money
            
    return list(money.values())

풀이

처음 작성한 코드

def solution(enroll, referral, seller, amount):
    answer = []
    
    d=dict() #연결 고리 트리
    res=dict()
    result=dict()
    
    for i in range(len(enroll)):
        d[enroll[i]]=referral[i]
        res[enroll[i]]=0
        result[enroll[i]]=0
        
    def cal(p):
        if d[p]!='-': #연결되어있는 사람이 있다는 뜻
            person=d[p]
            m=int(res[p]*0.1) ##수수료
            res[p]-=m
            res[person]=m
            cal(person)
        else:
            m=int(res[p]*0.1) ##수수료
            res[p]-=m
            
            for i in range(len(enroll)):
                result[enroll[i]]+=res[enroll[i]]
                res[enroll[i]]=0
    
    for i in range(len(seller)):
        if amount[i]==0:
            continue
        res[seller[i]]=amount[i]*100
        cal(seller[i])
    for i in result:
        answer.append(result[i])
    
    return answer


위와 같은 코드로 작성하니 런타임 에러나 시간 초과 문제가 있었다..
이런 문제를 어떻게 해결할 수 있을지 찾아보며 작성했지만, 해결이 어려워서 다른 사람의 코드를 참고하였다.

런타임 에러가 나는 이유는 재귀에서 depth가 너무 들어가 너무 깊어 생기는 문제라고 볼 수 있다고 한다. price 즉 10퍼센트 씩 줄어드는 (m)값이 0이면 굳이 재귀를 실행할 필요가 없기 때문에 시간 초과 문제를 해결할 수 있다고 했다.
하지만 내 코드에서 그러한 조건을 걸어주니 더 많은 오답이 나왔다..ㅠ

정답 풀이

정답 코드는 참고하여 해결하였다.
딕셔너리를 사용해 접근하는 방식은 맞았지만, 재귀를 쓰는 것이 아닌 while문으로 작성한 것을 볼 수 있었다.
해당 코드를 통해 zip()이라는 문법도 다시 돌아볼 수 있었다.

zip() 내장함수

데이터를 엮어주는 함수이다.
zip() 함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환합니다.

코드 참고 사이트

profile
I believe in myself.

0개의 댓글