흙금이네 블로그

[BOJ] 1890 - 점프 (Python, JavaScript) 본문

알고리즘

[BOJ] 1890 - 점프 (Python, JavaScript)

흙금 2023. 2. 22. 16:44

 

 

아이디어

 

동적 계획법을 이용해 각 칸에서 이동할 수 있는 칸의 경우의 수를 증가시켜 나간다.

 

 

풀이 #1 (Python)

 

게임판의 수를 2차원 리스트 board에 저장하고, 이동 경로의 수를 저장하는 0으로 채워진 2차원 리스트 dp를 생성한다.

board의 가장 오른쪽 아래 칸과 dp의 가장 왼쪽 위 칸에 각각 1을 저장한다.

board의 가장 오른쪽 아래 칸 값을 1로 바꿔 해당 칸 dp에 해당 칸 경로의 수를 더하는 것을 막는다.

이중 for문에서 현재 칸 (i, j)에서 이동할 수 있는 칸 (i+board[i][j], j)와 (i, j+board[i][j])의 dp에 현재 칸 경로의 수를 더한다.

 

import sys

input = sys.stdin.readline

def solution():
    N = int(input())
    board = [list(map(int, input().split())) for _ in range(N)]
    dp = [[0]*N for _ in range(N)]
    board[-1][-1] = 1
    dp[0][0] = 1
    for i in range(N):
        for j in range(N):
            if dp[i][j]:
                if i+board[i][j] < N:
                    dp[i+board[i][j]][j] += dp[i][j]
                if j+board[i][j] < N:
                    dp[i][j+board[i][j]] += dp[i][j]
    print(dp[-1][-1])

solution()

 

 

 

풀이 #2 (JavaScript)

 

풀이 #1과 마찬가지 방식으로 동작하며, 결과값의 최댓값이 Number 자료형의 범위를 벗어나므로 BigInt를 사용한다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

const N = +input[0];
let board = [];
for (let i=1; i<=N; i++) board.push(input[i].split(' ').map(Number));
let dp = Array.from(Array(N), () => Array(N).fill(BigInt(0)));
board[N-1][N-1] = 1;
dp[0][0] = BigInt(1);
for (let i=0; i<N; i++) {
    for (let j=0; j<N; j++) {
        if (dp[i][j]) {
            if (i+board[i][j] < N) dp[i+board[i][j]][j] += dp[i][j];
            if (j+board[i][j] < N) dp[i][j+board[i][j]] += dp[i][j];
        }
    }
}
console.log(String(dp[N-1][N-1]));

 

Comments