One of the common problems presented in coding tests is finding a way to reduce a given integer to 1. In this tutorial, we will explain the algorithms, approaches, and provide actual coding examples needed to solve this problem in detail. Our goal is to perform the minimum number of operations until the given integer becomes 1.
Problem Description
Given an integer X
. The problem is to reduce this X
to 1 using the following three operations and find the minimum number of operations required:
- 1.
X - 1
- 2.
X / 2
(only possible if X is divisible by 2) - 3.
X / 3
(only possible if X is divisible by 3)
For example, when X = 10
, it can be calculated as follows:
- 10 → 9 (1 operation)
- 9 → 3 (2 operations)
- 3 → 1 (3 operations)
Therefore, the total number of operations is 3.
Approach to Problem Solving
To solve this problem efficiently, we can use Dynamic Programming (DP). DP involves breaking the problem into smaller subproblems and storing the solutions to those subproblems to reduce redundant calculations. This approach will be explained in detail in the following steps.
Step 1: Initialize DP Table
Create a DP table to store the minimum number of operations required to reduce each index i
to 1. The size of the table is set to X + 1
.
X = int(input("Enter an integer: ")) dp = [0] * (X + 1)
Step 2: Set Base Case
By default, the value of dp[1]
is 0 because 1 is already the target, so no additional operations are needed.
dp[1] = 0 # 1 can be represented with 0 operations.
Step 3: Set Recurrence Relation
For each integer i
, perform all possible operations to update the value of dp[i]
.
- First, for the case of subtracting 1 from
i
:dp[i] = dp[i-1] + 1
- Then, if
i
is divisible by 2:dp[i] = min(dp[i], dp[i // 2] + 1)
- Also, if
i
is divisible by 3:dp[i] = min(dp[i], dp[i // 3] + 1)
In other words, we update the value of dp[i]
with the minimum operations.
Step 4: Derive Final Result
After filling the DP table for all integers, dp[X]
will be the desired result, that is, the minimum number of operations needed to reduce X
to 1.
for i in range(2, X + 1): dp[i] = dp[i - 1] + 1 if i % 2 == 0: dp[i] = min(dp[i], dp[i // 2] + 1) if i % 3 == 0: dp[i] = min(dp[i], dp[i // 3] + 1) print("Minimum number of operations:", dp[X])
Full Code
Below is the complete code based on the aforementioned explanations:
def min_operations_to_one(X): dp = [0] * (X + 1) dp[1] = 0 # Base case: 1 can be represented with 0 operations. for i in range(2, X + 1): dp[i] = dp[i - 1] + 1 # Case of subtracting 1 if i % 2 == 0: dp[i] = min(dp[i], dp[i // 2] + 1) # Case of dividing by 2 if i % 3 == 0: dp[i] = min(dp[i], dp[i // 3] + 1) # Case of dividing by 3 return dp[X] # User input X = int(input("Enter an integer: ")) result = min_operations_to_one(X) print("Minimum number of operations:", result)
Complexity Analysis
The above algorithm has a time complexity of O(N). This is because the DP table is filled using a loop iterating over X
. The space complexity is also O(N) due to the space required to store the DP array.
Conclusion
In this article, we explained the process of solving the problem of reducing a given integer to 1 using dynamic programming techniques. It is essential to learn various applications of DP in preparation for coding tests. We hope you enhance your skills through more practice problems and achieve great results in coding tests!