Swift Coding Test Course, Finding the Number of Steps

Hello everyone! Today, we will tackle one of the frequently appearing problems in coding tests, the ‘Counting Stair Numbers‘ problem. In this article, we will explore the definition of the stair number problem, the solution methods, and step-by-step Swift code examples. Ultimately, we will include efficient and concise code implementations along with various test cases.

Problem Definition

A stair number (n) is a number of length n, meaning that the difference between two consecutive digits is 1. For example, 123, 234, and 321 are stair numbers. However, 122 and 3456 are not stair numbers. Your task is to calculate the count of n-digit stair numbers for a given n.

Examples of the Problem

Let’s take an example of finding stair numbers with a given number of digits (n) using the digits from 1 to 9. Here are some examples:

  • n = 1: Result = 9 (1, 2, 3, 4, 5, 6, 7, 8, 9)
  • n = 2: Result = 17 (10, 12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 90)
  • n = 3: Result = 32 (101, 121, 123, 210, 212, …)

Approach to Solve the Problem

To solve this problem, we can use the Dynamic Programming technique. We solve the problem by utilizing the relationship between one-digit numbers and numbers above it, based on the properties of stair numbers.

Dynamic Programming Approach

First, we set the length of the stair number to n and establish a dp array to store the possible counts. dp[i][j] represents the count of stair numbers of length i with the last digit j. This allows us to set up a recurrence relation:

        dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
    

Here, j takes on values from 0 to 9. If the last digit is 0, the previous digit can only be 1, and if the last digit is 9, the previous digit can only be 8. Note that intermediate values can go both ways.

Basic Setup

Now, let’s initialize the DP table for solving the problem. Since the first digit of the stair numbers can only be from 1 to 9:

    for j in 0...9 {
        dp[1][j] = 1
    }
    

Next, we will set up a loop from the second digit up to n digits to fill the dp array.

Swift Code Implementation

Now, based on what we’ve explained above, let’s implement the code in Swift.

    func countStairNumbers(n: Int) -> Int {
        // Array to store the count of stair numbers for each digit
        var dp = Array(repeating: Array(repeating: 0, count: 10), count: n + 1)

        // For 1-digit numbers, there is 1 case for each from 1 to 9
        for j in 1...9 {
            dp[1][j] = 1
        }

        // Fill the DP array
        for i in 2...n {
            for j in 0...9 {
                if j > 0 {
                    dp[i][j] += dp[i - 1][j - 1]
                }
                if j < 9 {
                    dp[i][j] += dp[i - 1][j + 1]
                }
            }
        }

        var totalCount = 0
        // Sum up all cases for n-digit numbers
        for j in 0...9 {
            totalCount += dp[n][j]
        }

        return totalCount
    }

    // Usage example
    let result = countStairNumbers(n: 3)
    print("Count of 3-digit stair numbers: \(result)") // Output: 32
    

Code Explanation

The above code returns the count of n-digit stair numbers for a given n. The function sets up the dp array and calculates each possible case by adding the possibilities for each digit. Ultimately, it returns the total count of all n-digit numbers.

Test Cases

Let's create a few test cases to verify the correct operation of the function by checking the results for each digit count:

    print("1-digit count: \(countStairNumbers(n: 1))") // 9
    print("2-digit count: \(countStairNumbers(n: 2))") // 17
    print("3-digit count: \(countStairNumbers(n: 3))") // 32
    print("4-digit count: \(countStairNumbers(n: 4))") // X (to be computed and verified)
    print("5-digit count: \(countStairNumbers(n: 5))") // Y (to be computed and verified)
    

Conclusion

Today, we learned how to solve the counting stair numbers problem using Swift. We were able to devise an efficient solution to this problem through dynamic programming. I encourage you to understand and utilize this problem to tackle more algorithmic challenges!

Then, we'll see you next time with more interesting topics. Thank you!