문제

45656이란 수를 보자.

이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.

출력

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

내가 푼 풀이

- 길이 n의 계단 수를 구한다( 각 자리수의 차이가 1)

- i: 길이, j: 마지막자리의 숫자로 dp[i][j] 는 길이가 i인 마지막숫자 j가 오는 계단수의 갯수로 정의한다.

- dp[1][j] = 1 (  0 < j < 10 )

- 마지막자리 숫자가 0 인경우, 앞자리 수는 반드시 1 이와야하고, 마지막자리가 9라면, 앞자리 수는 반드시 8이어야 계단수가 성립한다.

- 나머지의 경우 는 마지막자리수 j의 앞자리수는 j-1 , j+1 이 될 수 있다.

- 이를 점화식으로 표현하면

  • if j == 0 , dp[i][0] = dp[i-1][1]
  • if j == 9 , dp[i][9] = dp[i-1][8]
  • dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

- dp값을 넣어줄때 항상 10억으로 나눠주고, 결과도 10억으로 나눠서 출력한다.

 

import Foundation

let num = Int(String(readLine()!))!
var dp = Array(repeating: Array(repeating: 0, count: 10), count: num+1)

for i in 1...9 {
    dp[1][i] = 1
}

if num == 1 {
    print(dp[num].reduce(0, +))
} else {
    for i in 2...num {
        for j in 0...9 {
            if j == 0 {
                dp[i][j] = dp[i-1][1] % 1000000000
            } else if j == 9 {
                dp[i][j] = dp[i-1][8] % 1000000000
            } else {
                dp[i][j] = (dp[i-1][j-1] + dp[i-1][j+1]) % 1000000000
            }
        }
    }
    
    print(dp[num].reduce(0, +) % 1000000000)
}

'코딩테스트 > 백준' 카테고리의 다른 글

BOJ-2193 이친수 Swift  (0) 2023.04.25
BOJ-1010 다리놓기 Swift  (0) 2023.04.21
BOJ-11727 2xN 타일링 2 Swift  (0) 2023.04.19
BOJ-2156 포도주 시식 Swift  (0) 2023.04.19
BOJ-9461 파도반 수열 Swift  (1) 2023.04.19

+ Recent posts