ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1890번 : 점프
    알고리즘 공부 2020. 5. 12. 20:25

      쉬운 문제인데 한 번 틀려서 괜히 자존심 상한다... 출력 값의 범위가 int를 벗어나서 생기는 문제여서 int로 선언한 dp 배열을 long long으로만 바꿔서 제출했더니 맞았다.ㅠㅠ


      풀이

      흔한 dp 문제다. 오른쪽 또는 아래쪽으로만 갈 수 있으므로 dp 계산을 위해 이중 for문 한 번만 사용하면 된다. 심지어 내가 쓴 코드에서 입력을 읽음과 동시에 바로 dp를 계산하면 아주 짧게 끝날 수도 있다.

     

    dp [i][j] : i열 j행까지 도착할 수 있는 경우의 수

     

      시작은 항상 1열 1행이고 오른쪽, 아래쪽으로만 갈 수 있으므로 다시 되돌아가는 경우는 절대로 발생할 수 없다. 따라서 자신의 위치에 도달할 수 있고

     

    dp[i][j] != 0

     

    자신의 값이 종착점이 아니

     

    value[i][j] != 0

     

    자신의 값만큼 오른쪽이나 아래쪽으로 움직일 수 있는 것이다.

     

    dp [i+value [i][j]][j] += dp [i][j]

    dp [i][j+value [i][j]] += dp [i][j]

     

    #include <iostream>
    
    using namespace std;
    
    int n;
    int value[102][102];
    long long dp[102][102];
    
    int main()
    {
        ios_base :: sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
        
        cin >> n;
        
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                cin >> value[i][j];
            }
        }
        
        dp[1][1] = 1;
        
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(dp[i][j] != 0 && value[i][j] != 0)
                {
                    int v = value[i][j];
                    dp[i+v][j] += dp[i][j];
                    dp[i][j+v] += dp[i][j];
                }
            }
        }
        
        cout << dp[n][n];
        
        return 0;
    }

    '알고리즘 공부' 카테고리의 다른 글

    백준 2011번 : 암호코드  (0) 2020.05.14
    백준 2629번 : 양팔저울  (0) 2020.05.10
    백준 2616번 : 소형기관차  (0) 2020.05.09
    백준 2666번 : 벽장문의 이동  (0) 2020.05.07
    백준 2229번 : 조 짜기  (0) 2020.05.07
Designed by Tistory.