[백준 9184번][Python/파이썬] 신나는 함수 실행

공학도 Lee·2023년 2월 11일
0

백준 문제 풀이

목록 보기
43/63
post-custom-banner

1. 문제


출처: 백준 9184번 신나는 함수 실행

2. 풀이


문제에 적혀 있는 재귀 함수를 함수로 구현하고, 속도 향상을 위해 동적 계획법(DP)을 섞어 주면 된다.
재귀적으로 접근해 나갈 때 이미 계산했던 값을 또다시 계산하지 않도록, 값을 저장해둘 무언가를 만들면 된다.

이때, 개인적으로 어려웠던 것은 값을 어떻게 저장해야 하는가였다.
list로 구현하자니 3차원 배열이 되는데, 해결해야 되는 문제에 비해 저장하는 방식이 뭔가 과도하게 커지는 듯한 느낌이 들었다.
다른 분의 풀이를 보니 dictionary 키값을 적절하게 활용하셨고, 코드를 훨씬 단순하게 만들 수 있었다.

3. 소스코드


memo = {}
def w(a,b,c):
    if (a,b,c) in memo:
        return memo[(a,b,c)]
    if a<=0 or b<=0 or c<=0:
        return 1
    if a>20 or b>20 or c>20:
        if (20,20,20) in memo:
            return memo[(20,20,20)]
        else:
            return w(20,20,20)
    if a < b and b < c:
        memo[(a,b,c)] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
        return memo[(a,b,c)]
    else:
        memo[(a,b,c)] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1)
        return memo[(a,b,c)]
while True:
    a,b,c = map(int,input().split())
    if [a,b,c] == [-1,-1,-1]:
        break
    else:
        print("w({}, {}, {}) = {}".format(a,b,c,w(a,b,c)))

4. 그 외


dictionary 사용에 익숙해질 필요가 있다. 지금 다시 봐도 바로 안 떠올랐던 것 보면, 조금 시간이 걸릴 듯하다.

profile
이창민, Changmin Lee
post-custom-banner

0개의 댓글