문제에 적혀 있는 재귀 함수를 함수로 구현하고, 속도 향상을 위해 동적 계획법(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
사용에 익숙해질 필요가 있다. 지금 다시 봐도 바로 안 떠올랐던 것 보면, 조금 시간이 걸릴 듯하다.