https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
난이도 : 실버 1
태그 : 다이나믹 프로그래밍
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인 경우밖에 없기 때문입니다.
2. 소스코드
<kotlin />
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)
}
3. 후기
다이나믹 프로그래밍. 재밌지만 어렵습니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 14503번] [Kotlin] 로봇 청소기 (0) | 2023.05.14 |
---|---|
[백준 16235번] [Kotlin] 나무 재테크 (0) | 2023.05.13 |
[백준 13418번] [Kotlin] 학교 탐방하기 (0) | 2023.05.11 |
[백준 2250번] [Kotlin] 트리의 높이와 너비 (1) | 2023.05.10 |
[백준 20955번] [Kotlin] 민서의 응급 수술 (0) | 2023.05.07 |