얼핏 볼 때는 뭔가 까다로운 문제일 것 같지만, 조금만 읽어봐도 어렵지 않게 풀 수 있다.
어차피 w 함수의 a, b, c 값들이 재귀에서 반드시 - 로만 내려가기 때문에, 이전 값들을 구해놓으면 다시 쓸 수 있다.
0 이하와 20 초과는 특정 값을 반환하기 때문에, 실제로는 1,1,1 부터 20,20,20 까지만 구하면 된다.
재귀 호출만 생각하면 신이 난다?
w = [[[1 for a in range(21)] for b in range(21)] for c in range(21)] # 계산된 w값들. 재사용하여 재귀를 막음
def pre_calculate(a, b, c): # 주어진 알고리즘 그대로
if a < b and b < c:
w[a][b][c] = w[a][b][c-1] + w[a][b-1][c-1] - w[a][b-1][c]
else:
w[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]
for a in range(1, 21):
for b in range(1, 21):
for c in range(1, 21):
pre_calculate(a, b, c) # w 함수 재귀호출을 미리 계산해놓음
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1: # 종료 값인지 검사
break
answer = 0
if a <= 0 or b <= 0 or c <= 0: # 하나라도 0 이하가 있으면 무조건 1
answer = 1
elif a > 20 or b > 20 or c > 20: # 전부 다 20 초과일 경우 20,20,20 의 값 반환
answer = w[20][20][20]
else:
answer = w[a][b][c] # 그 외엔, 미리 계산해둔 w 출력값 반환
print(f"w({a}, {b}, {c}) =", answer)