[백준 10844] 쉬운 계단 수

2 분 소요

문제

링크

45656이란 수를 보자.

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

세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)

입력

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

출력

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

풀이

N == 1 일 때, 계단 수 : 1,2,3,4,5,6,7,8,9
N == 2 일 때, 계단 수 : 10,12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98

규칙을 찾아 보자
N == 1 일 때, 계단 수 에서 N == 2일 때, 계단 수를 구할 수 있을까?
N == 2 일 때, 계단수 10, 12를 봐보자
N == 2 일 때, 10과 12는 N == 1 일 때, 1에서 0 과 2를 1의 자리에 넣어 준 것과 같다
N == 2 일 때, 21과 23은 N == 1 일 때, 2에서 1과 3을 1의 자리에 넣어 준 것과 같다.
N == 2 일 때의 계단 수는 N == 1일 때 계단 수에서 1의 자리에서 +1과, -1을 해준 숫자들이 들어감을 확인할 수 있다
N == 2 일 때, 10과 12는 N == 1 일 때, 1에 1 - 1, 즉 0을 붙여 10, 1 에 1 + 1, 즉 2를 붙여 12가 만들어 짐을 알 수 있다.
이를 이용하면 N이 주어질 때 마지막 1의 자리가 K인 숫자의 계단 수의 갯수는
N - 1 번째의 K - 1의 계단 수의 갯수 + N - 1번째의 K + 1의 계단수의 갯수일 것이다
예를 들어 N == 2 일 때 1의 자리 숫자가 3으로 끝나는 계단 수의 갯수는
N == 1 일 때, 2의 갯수, 그리고 4의 갯수를 합치면 된다
글 보다 표를 그려 확인 해보자

수식으로 구성 해보자
N : 숫자의 길이, K : N 의 계단 수의 1의 자리
N[K] = N-1[K - 1] + N-1[K+1] 이 때, 주의 할 것이 있다
N[K] == 0 일 경우엔 이전 단계에서 1일 경우만 더해주고 ( 즉, N-1[1])
K == 9 : 8일 경우만 더해 준다 ( 즉 N-1[8])

이를 그대로 코드로 옮겨 보자

func solve(n : Int) {
    if n == 1 { // 1일 경우는 무조건 9개 밖에 없다
        print(9)
        return
    }
    let mod = 1_000_000_000 // 결과값에서 쓰일 나머지 연산 값 
    var map = Array(repeating: Array(repeating: 0, count: 10), count: 101)
    
    for i in 1 ... 9 {
        map[1][i] = 1
    }
    
    for i in 2 ... n {
        map[i][0] = map[i-1][1]
        map[i][9] = map[i-1][8]
        for k in 1 ... 8 {
            map[i][k] = (map[i-1][k - 1] + map[i-1][k + 1]) % mod
        }
    }
    
    let result = map[n].reduce(0,+)
    
    print(result % mod)
}

태그:

카테고리:

업데이트:

댓글남기기