Published:
Updated:

  • dp라는 태그가 없었다면 dp 문제라고 파악하기 어려웠을 것 같다.


Solution

import sys
from typing import List


def solution(N: int, nums_list: List[List[int]]) -> int:
    # dp: 해당 위치로 올 수 있는 경로의 개수의 배열
    dp = [[0] * N for _ in range(N)]
    # (0, 0) 위치는 항상 올 수 있으므로 1로 설정
    dp[0][0] = 1

    for i in range(N):
        for j in range(N):
            # 현재의 위치가 가장 오른쪽 아래 칸이라면 종료
            if i == N - 1 and j == N - 1:
                break

            current_jump = nums_list[i][j]

            # 현재 위치만큼 "아래로" 이동한 거리가 유효하다면
            # 그 위치의 경로의 개수에 현재 위치의 경로 개수를 더함
            if 0 <= i + current_jump < N:
                dp[i + current_jump][j] += dp[i][j]

            # 현재 위치만큼 "오른쪽으로" 이동한 거리가 유효하다면
            # 그 위치의 경로의 개수에 현재 위치의 경로 개수를 더함
            if 0 <= j + current_jump < N:
                dp[i][j + current_jump] += dp[i][j]

    return dp[N - 1][N - 1]


N = int(sys.stdin.readline().rstrip())
nums_list: List[List[int]] = []
for _ in range(N):
    nums_list.append(list(map(int, sys.stdin.readline().rstrip().split())))

print(solution(N, nums_list))


Reference

Leave a comment