코딩테스트/Kotlin

[백준 10844번] [Kotlin] 쉬운 계단 수

유노 Uknow 2023. 5. 12. 15:09

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

 

10844번: 쉬운 계단 수

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

www.acmicpc.net

 

난이도 : 실버 1
태그 : 다이나믹 프로그래밍

 

 

설명

다이나믹 프로그래밍을 응용할 수 있겠는데요.

 

XXXX7 라는 계단 수를 만들려면, 바로 직전 계단수는 뭘까요?

바로 XXX6, XXX8 입니다.

직전 값과 1만큼 차이가 나면 되는 것이죠.

즉, XXXX7이 될 수 있는 경우의 수는 XXX6의 경우의 수와 XXX8의 경우의 수를 더한 것과 같습니다.

 

XXXX7는 5자리, 현재 값은 8 입니다.

이를 dp[자리 수(i)][값(j)] 으로 나타내면,

dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] 라는 점화식을 도출할 수 있습니다.

 

단, 현재 값이 0 또는 9일 경우 예외를 처리해줘야 합니다.

0이 되는 경우의 수는 직전 값이 1인 경우,

9가 되는 경우의 수는 직전 값이 8인 경우밖에 없기 때문입니다.

 

 

 

 

소스코드

fun main() = with(System.`in`.bufferedReader()) {
    val div = 1000000000L
    val n = readLine().toInt()

    val dp = Array(n) { Array(10) { 0L } }

	// 1 자리수 일 때는 모두 경우의 수가 1가지 밖에 존재하지 않음
    for (i in 1..9) dp[0][i] = 1

    for (i in 1 until n) {
        dp[i][0] = dp[i - 1][1] // 0이 되는 경우는 직전 값이 1인 경우 밖에 없음
        dp[i][9] = dp[i - 1][8] // 9가 되는 경우는 직전 값이 8인 경우 밖에 없음

        for (j in 1..8) {
            dp[i][j] += dp[i - 1][j - 1]
            dp[i][j] += dp[i - 1][j + 1]
            dp[i][j] %= div
        }
    }

    println(dp[n - 1].sum() % div)
}

 

 

 

후기

다이나믹 프로그래밍. 재밌지만 어렵습니다.