양수로 이루어진 m x n 그리드를 인자로 드립니다.
상단 왼쪽에서 시작하여, 하단 오른쪽까지 가는 길의 요소를 다 더했을 때,가장 작은 합을 찾아서 return 해주세요.
한 지점에서 우측이나 아래로만 이동할 수 있습니다.
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
설명: 1→3→1→1→1 의 합이 제일 작음
def min_path_sum(grid):
# 여기에 코드를 작성해주세요.
m = len(grid[0])
n = len(grid)
result = {}
for i in range(m):
for j in range(n):
if i == 0 and j == 0:
result[(i,j)] = grid[0][0]
elif i == 0 and j > 0:
result[(i,j)] = result[(i,j-1)] + grid[0][j]
elif j == 0 and i > 0:
result[(i,j)] = result[(i-1,j)] + grid[i][0]
else:
result[(i,j)] = min(result[(i-1,j)],result[i,j-1])+grid[i][j]
return result[(m-1,n-1)]
풀이에 대해 접근조차 하지 못해서, 구글 검색을 통해 동적 계획법
이라는 알고리즘을 알게 되었다.
동적 계획법이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법인데, 부분적으로 문제가 반복되는 유형과 최적 부분 구조를 가지고 있는 알고리즘을 해결하는데 사용된다. 부분적으로 문제를 해결해서 답을 구하면 그 답을 다음 문제에 적용할 수 있으므로, 하위 문제가 기하급수적으로 많을 때 유용하다.
위 문제도 각 좌표의 최단 거리값이 다음 좌표의 최단 거리값을 구하는 데 사용되므로 동적 계획법이 적용되었다고 볼 수 있다.