728x90
⬛ 백준 1890번. 점프 - DP 문풀
https://www.acmicpc.net/problem/1890
문제
N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다.
각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로 점프를 하는 두 경우만 존재한다.
가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 오른쪽 아래 칸에는 항상 0이 주어진다.
출력
가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 문제의 규칙에 맞게 갈 수 있는 경로의 개수를 출력한다. 경로의 개수는 2^63-1보다 작거나 같다.
💚 문제 접근 방식
[주의] 경로의 개수는 2^63 보다 작거나 같다고 되어 있다.
DP[][] 안에 들어올 값이 int형 범위를 넘기 때문에 long 타입으로 선언해줘야 한다.
- DP[i][j] 정의 : (1,1) → (i, j) 규칙에 맞게 올 수 있는 경로의 개수
- DP[i][j] 점화식
다음 정점으로 이동 가능한 칸의 수가
int nx = arr[i][j] 에 담겨있다.
if( nx + i <= N) : DP[nx+i][j] += DP[i][j];
if( nx + j <= N) : DP[i][nx+j] += DP[i][j];
- 결과적으로 arr[i][j] 에 들어와있는 칸의 값 만큼 다음으로 이동할 수 있고, 그 방향은 오른쪽이거나 아래쪽만 가능하다고 되어 있다.
int nx = arr[i][j]로 둔 다음, 현재 좌표에서 다음으로 nx칸만큼 이동할 방법은
오른쪽 방향으로 (i+nx)
아래쪽 방향으로 (j+nx)
- 두 좌표값이 보드판 N크기를 넘어서지 않는 경우에 한해서만, nx칸만큼 이동이 가능하며, 해당 경로에 안착했을 떄, DP[][] 값은 기존 값에 + 직전에서 건너온 경로 개수를 누적합 한다.
- 최종적으로 dy[N][N]의 값을 출력하면 (1,1) -> (N,N) 에 안착하는 모든 경로의 개수가 출력된다.
💚 제출 코드
import java.util.*;
public class Main {
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner kb= new Scanner(System.in);
int N= kb.nextInt();
int[][] arr = new int[N+1][N+1];
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
arr[i][j] = kb.nextInt();
}
}
/**
* dy[i][j] : (1,1)에서 (i,j)까지 규칙에 맞게 이동 가능한 경로의 개수
*/
long[][] dy = new long[N+1][N+1]; //2^63까지 가능
dy[1][1] = 1;
//무조건 오른쪾, 아래쪽 두 방향만 가능
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
int nx = arr[i][j];//다음 이동 점프
if(nx == 0) break;//목적지 도착
if(i + nx <= N) {
dy[i+nx][j] += dy[i][j];//직전 경로 ++ 처리
}
if(j+nx <=N) {
dy[i][j+nx] += dy[i][j];
}
}
}
System.out.println(dy[N][N]);//마지막 칸
}
}
728x90
'코딩 테스트 [준비] > [문풀] Baekjoon_백준 문풀_조지기' 카테고리의 다른 글
백준 | 1753번. 최단 경로 - 최단 경로 (다익스트라) 문풀 (72) | 2024.01.13 |
---|---|
백준 | 9251번. 최장 공통 부분 수열(LCS) 찾기 - DP 문풀 (79) | 2024.01.11 |
백준 | 11053번. 가장 긴 증가하는 부분 수열 - DP 문풀 (76) | 2024.01.10 |
백준 | 1912번. 연속합 - DP 문풀 (68) | 2024.01.08 |
백준 | 2579번. 계단 오르기 - DP 문풀 (66) | 2024.01.08 |