공부공간

BOJ - 1890 ) 점프 본문

알고리즘/Dynamic Programming

BOJ - 1890 ) 점프

개발자가될수있을까? 2020. 1. 30. 23:50

 


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

 

1890번: 점프

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

www.acmicpc.net

 


DP는 너무나도 어려운것 같다.

 

점프는 맵에 표시된 수만큼 오른쪽과 아래로 점프한다.

 

최종 목적지까지 가는 경로를 찾아주면된다.

 

중간에 한 지점을 생각해서 그 지점에 올수있는 경우의 수가 DP값에 저장된다.

 

처음 시작지점에 DP 값을 1로 설정하여 움직일수있는 지점에다가 현재의 DP값을 저장해준다.

 

그렇게 누적되어가는 값이 그 지점으로 올수있는 경우의 수를 뜻한다.

 

즉 그게 마지막 지점이면 처음에서 시작해서 마지막에 올수있는 모든 경우의 수이다.

 

처음에는 BFS로 QUEUE에 좌표를 넣고 진행하려했었지만 시간초과가 날것 같았다.

 

또한 문제에서 경우의수는 2^63-1이라고 지정해준것을 못봐서 70%에서 계속 틀렸다고 나왔다.

 

경우의수를 저장해주는 DP배열을 long형으로 바꾸어 주어야했다ㅠ

 

또한 디버깅하다가 맨 마지막 지점에 도착했을때 좌표가 0 0 이므로 자기 자신의 값을 한번더 더하는 예외가 발생하여 

 

처리해주었다. DP너무어렵다 ㅠㅠ

 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N =Integer.parseInt(st.nextToken())+1;
        int map[][] = new int[N][N];
        long dp[][] = new long[N][N];
        dp[1][1=1;
        for(int y = 1 ; y < N ; y++) {
            st = new StringTokenizer(br.readLine());
            forint x = 1 ; x < N ; x++) {
                map[y][x] = Integer.parseInt(st.nextToken());
            }
        }
        
        for(int y = 1 ; y < N ; y++) {
            for(int x = 1 ; x < N ; x++) {
                if(dp[y][x]==0 || (x==N-1 && y == N-1)) continue;
                
                if(y+map[y][x] <N)dp[y+map[y][x]][x]+=dp[y][x];
                if(x+map[y][x] <N)dp[y][x+map[y][x]]+=dp[y][x];
                
            }
        }
        
        System.out.println(dp[N-1][N-1]);
        
    }
}
 
 
 
cs
 

index는 정수값..

패키지는빼주고 클래스이름은 Main으로..

'알고리즘 > Dynamic Programming' 카테고리의 다른 글

BOJ - 11066 ) 파일 합치기  (0) 2020.02.11
BOJ - 1965) 상자 넣기  (0) 2020.02.06
BOJ - 11048 ) 이동하기  (0) 2020.01.30
BOJ - 2294 ) 동전 2  (0) 2020.01.30
BOJ - 2293) 동전 1  (0) 2020.01.30
Comments