다이나믹 프로그래밍 한접시

[백준] 1890번: 점프 [C#]

NaZZU 2024. 4. 10. 23:21

 

게임 판에서 해당 칸의 숫자만큼 점프를 뛰어서 맨 마지막 자리에 도달할 경우의 수를 출력하는 문제이다.

경로의 개수는 2의 63제곱 -1 만큼 주어지는 것을 유의해야 한다. 

 

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
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace 연습장
{
    internal class _1890_boj
    {
        public void boj_1890()
        {
            int N = int.Parse(Console.ReadLine());
 
            int[,] dp = new int[N, N];
            dp[00= 1;
 
            int[,] arr = new int[N, N];
 
            for (int i = 0; i < N; i++)
            {
                int[] input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                for (int j = 0; j < N; j++)
                    arr[i, j] = input[j];
            }
 
            for (int a = 0; a < N; a++)
            {
                for (int b = 0; b < N; b++)
                {
                    if (a == 3 && b == 3)
                        break;
                    if (dp[a, b] == 0)
                        continue;
                    if (a + arr[a, b] <= N - 1)
                        dp[a + arr[a, b], b] += dp[a, b];
                    if (b + arr[a, b] <= N - 1)
                        dp[a, b + arr[a, b]] += dp[a, b];
                }
            }
 
            Console.WriteLine(dp[N - 1, N - 1]);
 
        }
 
    }
}
 
cs

 

지금까지 풀어왔던 dp문제들은 뒤의 칸이 전의 칸의 값을 참조해와서 증/감산이 이루어졌다.

하지만 이번 문제는 전의 칸이 뒤의 칸에 직접 영향을 주는(직접 가/감을 하는) 문제였던 거 같다.

 

마지막 칸에 도달하면 루프에서 벗어나야 하는데, 벗어나는 코드를 만들지 않아서 값이 이상하게 나왔었다. 

예제로 보면 계산을 잘 해서 마지막 칸에 3이 들어갔었지만, 마지막 칸이 자기 자신의 값으로 2번 더해서 12라는 이상한 값이 나왔던 것이었다.

 

또한, long형으로 주어지는 입력을 모르고 int형으로 받아와서 오류가 났었다.

문제를 더욱 꼼꼼히 읽어보는 습관을 길러야겠다.