
문제에 적혀 있는 재귀 함수를 함수로 구현하고, 속도 향상을 위해 동적 계획법(DP)을 섞어 주면 된다.
재귀적으로 접근해 나갈 때 이미 계산했던 값을 또다시 계산하지 않도록, 값을 저장해둘 무언가를 만들면 된다.
이때, 개인적으로 어려웠던 것은 값을 어떻게 저장해야 하는가였다.
list로 구현하자니 3차원 배열이 되는데, 해결해야 되는 문제에 비해 저장하는 방식이 뭔가 과도하게 커지는 듯한 느낌이 들었다.
다른 분의 풀이를 보니 dictionary 키값을 적절하게 활용하셨고, 코드를 훨씬 단순하게 만들 수 있었다.
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)))
dictionary 사용에 익숙해질 필요가 있다. 지금 다시 봐도 바로 안 떠올랐던 것 보면, 조금 시간이 걸릴 듯하다.