Swift Coding Test Course, Queueing

Hello! Today, as part of the Swift coding test course, we will address the queueing problem.
This is one of the frequently encountered problems in coding interviews and is an algorithm that is widely used in actual work environments.
In this post, I will explain the definition of the problem, the solution method, a Swift code example for it, and optimization strategies in detail.

Problem Definition

There are several students standing in line. Given each student’s number,
the problem is to calculate how many exchanges are needed for the students to be arranged in the correct order.
Each student knows their position in line, and each student’s
number is given as a natural number from 1 to N. Only two students can swap positions at a time, and
the goal is to solve the problem with the minimum number of exchanges.

Input Format

The first line contains the number of students N, and the next line contains N integers separated by spaces,
representing the current positions of the students in line.

Example Input

5
2 1 5 3 4
    

Output Format

Output the minimum number of exchanges needed to sort in the correct order.

Example Output

3
    

Solution Process

To solve this problem, we need to find a method to minimize position changes.
It is important to identify the positions where exchanges are needed while checking if each student is in the order they should be.
The basic approach is to use “cycle detection.”
We trace each student, tracking the process of getting them into the correct position.

Step 1: Cycle Analysis

Initially, we calculate the correct position for each student using their numbers.
For example, student 1 should be at index 0 (i=0).
Student 2 should be at index 1 (j=1), and student 5 should be at index 4 (k=4).
We check the given order to determine the direction in which swaps should occur to move to these correct positions.

Step 2: Calculate Number of Swaps

To ensure each student is in the correct position, we examine the length of the cycles.
If the length of the cycle is k, then (k-1) swaps are needed.
For example, if the cycle length is 3, 2 swaps are needed.
Thus, summing the number of swaps for each cycle gives us the minimum number of swaps required.

Step 3: Implement Swift Code

Now, let’s write Swift code according to the algorithm described above.


    func minimumSwaps(arr: [Int]) -> Int {
        let n = arr.count
        var indexedArr = Array(zip(arr, 0.. 0 {
                swaps += (cycle_size - 1)
            }
        }
        
        return swaps
    }
    

Example Execution

Let’s run the example using the above function:


    let studentPositions = [2, 1, 5, 3, 4]
    let result = minimumSwaps(arr: studentPositions)
    print("Minimum number of swaps: \(result)")
    

Code Explanation

– The minimumSwaps function takes the array of the students’ current positions as input.
– First, it pairs the students with their indices and sorts them based on their correct positions.
– It declares an array for visited checking, examining the cycles at each student’s position,
– counting the size of the cycles for students who are not in the correct positions.
– Finally, it counts the necessary swaps for each cycle ((cycle size – 1)) and returns the total.

Optimization and Additional Considerations

This algorithm has a complexity of O(N log N) due to the sorting process, which can lead to significant performance degradation.
However, if the number of students is not too large, this approach is sufficiently fast and efficient.
While there are other methods to solve this problem, the cycle-based analysis is the most intuitive and straightforward.

Conclusion

Today, through the queueing problem using Swift,
we had the opportunity to enhance our algorithm problem-solving skills.
The code is simple, but it combines multiple concepts, particularly the ideal process of cycle detection.
I hope to build skills through more algorithms and problem-solving and be helpful in interview preparation!