본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 1890번: 점프 -Python

728x90

[백준알고리즘] 1890번: 점프 -Python

https://www.acmicpc.net/problem/1890

 

1890번: 점프

문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로

www.acmicpc.net

재귀를 사용한 동적계획법으로 문제를 풀었다.

 

동적 계획법으로 풀 수 있는 문제이다 보니 여러 방법이 있겠지만 마지막에 도착할 수 있는 곳들의 경로의 수를 구해갔다.

 

중간에 메모리초과가 났었는데, visited[i][j] < 0일 때 아직 방문하지 않은 지점이기 때문에 visited[i][j]를 구해주어야 했는데, visited[i][j] <= 0처럼 등호가 들어가 버려서 무한루프를 돌아서 발생한 문제였다.

 

from sys import setrecursionlimit
setrecursionlimit(10**9)

def dp(i, j):
    if visited[i][j] < 0:    
        visited[i][j] = 0
        d = table[i][j]
        if i+d < n:
            visited[i][j] += dp(i+d, j)
        if j+d < n:
            visited[i][j] += dp(i, j+d)
    return visited[i][j]

n = int(input())
table = [list(map(int, input().split())) for _ in range(n)]
visited = [[-1] * n for _ in range(n)]
visited[-1][-1] = 1
dp(0, 0)
print(visited[0][0])

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90