아래의 함수를 메모이제이션으로 바꾸자.
# 반환 값은 항상 음이 아닌 정수
someObscureFunction(a, b);
cache = [[-1] * 2500 for _ in range(2500)]
def someObscureFunction(a, b):
# 기저 사례를 처리.
if ...:
return ...
# [a][b]에 대한 답을 구한 적이 있으면 반환.
ret = cache[a][b]
if ret != -1:
return ret
# 답을 구하자.
....
return ret
예제)
input :
output :
현재 문제의 기저 사례는 ? 현재 위치가 '끝' 점인가
그렇지 않다면, 아래 / 오른 쪽으로 이동할 때 여전히 격자 안에 위치한다면 재귀를 실행하자.
-->>
현재 문제의 기저 사례는 ? 현재 위치가 '끝' 점인가
와 격자 안에 존재하는가
두가지를 판별하고 언제나 재귀를 실행해라.
#격자의 길이
n
# 입력을 받았으면 1줄씩 넣으면 됨.
board[]
def jump(x, y):
# 기저사례중 1. 현재 격자 안인지 판별.
if x >= n or y >= n:
return False
# 2. '끝'점인지 확인
if y == n - 1 and x == n - 1:
return True
jumpSize = board[x][y]
return jump(x + jumpSize, y) or jump(x, y + jumpSize)
왜 or
로 재귀를 실행하는 가?
-> 끝 점에 도달하는 지 판별만 하면 되기 때문. 그리고 리턴값이 boolean
이기에 가능하다.
우리는 있는지 없는지만 판별할 거기에 boolean
값을 이용하는데 이를 리스트에 넣어서 이용할 것이니 '0'과 '1'을 이용해 나타낸다.
#격자의 길이
n
# 입력을 받았으면 1줄씩 넣으면 됨.
board[]
# 중복되는 계산 값들을 저장할 리스트.
cache = [[-1] * 100 for _ in range(100)]
def jump(x, y):
# 기저사례중 1. 현재 격자 안인지 판별.
if x >= n or y >= n:
return 0
# 2. '끝'점인지 확인
if y == n - 1 and x == n - 1:
return 1
ret = cache[x][y]
if cache != -1:
return ret
jumpSize = board[x][y]
return ret = (jump(x + jumpSize, y) or jump(x, y + jumpSize))