ezhoon

[백준] 10844 쉬운 계단 수_Java 본문

[Java] 백준 문제풀이/DP

[백준] 10844 쉬운 계단 수_Java

ezhoon 2022. 3. 3. 10:46

📖  문제


백준 10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

⚠️  주의사항


  • 0으로 시작하는 경우는 없다.
  • 0 혹은 9로 끝나는 경우는 각각 1과 8로만 파생된다.

 

✍️  이해


/**
 * 1. 인접한 모든 자릿수가 1씩 차이나지만 0은 1로 9은 8로 하나씩만 파생이된다.
 * 2. 단 0으로 시작하는 경우는 없기에 처음에 선언 할 때 0은 제외 할 것
 * 3. 점화식 : dp[n][i] = dp [n-1][i-1] + dp [n-1][i+1]
 * 4. 재귀 방식으로 풀이
 * 5. 메모이제이션 사용
 */

4번 메모이제이션을 처음에는 적용하지 않아 시간 초과가 계속 떴다.

✏️  풀이


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static int N;
    static Long[][] arr;

    public static void main(String[] args) throws IOException {
        Main T = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        arr = new Long[N + 1][10];

        for (int i = 0; i <= 9; i++) {
            arr[0][i] = 1L;
        }

        long answer = 0;
        for (int i = 1; i <= 9; i++) {
            answer += T.solution(N, i);
        }
        System.out.println(answer % 1000000000);
    }

    public long solution(int L, int temp) {
        if (L == 1) {
            return arr[L][temp];
        }
        if (arr[L][temp] == null) {

            if (temp == 0) {
                arr[L][temp] = solution(L - 1, 1);
            } else if (temp == 9) {
                arr[L][temp] = solution(L - 1, 8);
            } else {
                arr[L][temp] = solution(L - 1, temp + 1) + solution(L - 1, temp - 1);
            }
        }
        return arr[L][temp] % 1000000000;
    }
}

재귀를 사용한다면 무조건 메모이제이션까지 같이 생각하자

'[Java] 백준 문제풀이 > DP' 카테고리의 다른 글

[백준] 2193 이친수_Java  (0) 2022.03.21
[백준] 11057 오르막 수_Java  (0) 2022.03.17
[백준] 9059 1,2,3더하기_JAVA  (0) 2022.03.02
[백준] 11727 2xn 타일링_Java  (0) 2022.03.01
[백준] 11726 2xn 타일링_Java  (0) 2022.03.01
Comments