알고리즘 문제/백준

[백준] 1890번: 점프 (Java)

Lpromotion 2024. 8. 3. 21:36

💡문제 분석 요약

각 칸에 현재 갈 수 있는 거리가 적혀있는 NxN 게임판이 주어지고, 반드시 오른쪽이나 아래쪽으로 이동할 수 있다. 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 문제이다.

  • 시간 제한: 1초
  • 메모리 제한: 128MB

 

💡알고리즘 설계

  • 이동 경로를 저장할 `dp`배열을 생성한다.
  • 시작 위치인 `dp[0][0]`을 1로 설정하고, 이중 for문으로 게임판 배열을 탐색한다.
  • 탐색 위치가 게임판의 가장 오른쪽 아래 칸이면 반복문을 종료한다.
  • 게임판에 적혀있는 숫자만큼 오른쪽 또는 아래쪽으로 이동할 수 있으면 `dp`배열에 경로를 저장한다.

 

💡코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[][] gameBoard = new int[N][N];
        for(int i=0; i<N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<N; j++) {
                gameBoard[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        long[][] dp = new long[N][N];
        dp[0][0] = 1; // start
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                if(i==N-1 && j==N-1) break;

                if(gameBoard[i][j]+i < N)
                    dp[gameBoard[i][j]+i][j] += dp[i][j];
                if(gameBoard[i][j]+j < N)
                    dp[i][gameBoard[i][j]+j] += dp[i][j];
            }
        }

        System.out.println(dp[N-1][N-1]);
    }
}

 

💡시간복잡도

$O(N^2)$

 

💡 틀린 이유

`dp`배열을 long 타입으로 선언해야 하는데 int 타입을 사용했다.

 

💡 틀린 부분 수정

`dp`배열을 long 타입으로 변경했다.

long[][] dp = new long[N][N];

 

💡 느낀점 or 기억할정보

문제에서 “경로의 개수는 $2^{63}-1$보다 작거나 같다.” 라는 문장이 있어 long 타입을 사용해야 한다는 것이 언급되었지만, 코드를 작성하며 이것을 잊고 int 타입으로 선언해서 틀리게 되었다.

문제에서 주어진 기억해야하는 중요한 정보도 알고리즘 설계에 작성해야 코드를 작성할 때 기억할 수 있을 것 같다.

반응형