스위프트 코딩테스트 강좌, 기수 정렬

안녕하세요! 오늘은 스위프트를 사용한 기수 정렬(Radix Sort) 알고리즘에 대해 다뤄보겠습니다. 기수 정렬은 비슷한 숫자들을 그룹으로 묶어 정렬하는 효율적인 알고리즘으로, 주로 정수의 집합을 정렬하는 데 사용됩니다.

기수 정렬의 개요

기수 정렬은 숫자나 문자열을 자리수 단위로 나누어 정렬하는 비교 기반 정렬 알고리즘입니다. 기수 정렬은 다음과 같은 방식으로 작동합니다:

  • 주어진 숫자를 특정 자리수로 분해합니다.
  • 각 자리수에서 가장 작은 자리수(LSB)부터 시작하여 정렬합니다.
  • 자리수를 올려가며 이를 반복합니다.

기수 정렬은 안정 정렬 알고리즘이며, 평균과 최악의 경우 시간 복잡도는 O(nk)입니다. 여기서 n은 요소의 개수, k는 최대 자리수입니다.

문제 설명

이제 기수 정렬을 사용하여 다음 문제를 해결해 보겠습니다.

문제:

다음의 정수 배열을 기수 정렬 알고리즘을 사용하여 오름차순으로 정렬하시오:

[170, 45, 75, 90, 802, 24, 2, 66]

문제 풀기

문제를 해결하기 위해 기수 정렬 알고리즘을 단계별로 구현해 보겠습니다. 스위프트 언어로 미리 정의된 함수와 구조체를 사용하여 코드를 작성하겠습니다.

1단계: 자리수 기준으로 분리하기

기수 정렬의 첫 번째 단계로 각 자릿값을 기준으로 분리합니다. 이 작업을 수행하기 위해 자리수에 맞게 숫자를 추출하는 함수를 만듭니다.

func getDigit(number: Int, digitIndex: Int) -> Int {
    return (number / Int(pow(10.0, Double(digitIndex)))) % 10
}

2단계: 기수 정렬 알고리즘 구현하기

이제 전체 기수 정렬 알고리즘을 구현해 보겠습니다. 우리는 자리수에 따라 그룹으로 나누고 그에 따라 정렬을 수행할 배열을 만들어야 합니다.

func radixSort(array: [Int]) -> [Int] {
    let maxNumber = array.max() ?? 0
    let maxDigits = String(maxNumber).count
    
    var sortedArray = array
    
    for digitIndex in 0.. [Int] {
    let countArraySize = 10
    var countArray = [Int](repeating: 0, count: countArraySize)
    var outputArray = [Int](repeating: 0, count: array.count)
    
    for number in array {
        let digit = getDigit(number: number, digitIndex: digitIndex)
        countArray[digit] += 1
    }
    
    for index in 1..

3단계: 결과 출력하기

이제 기수 정렬 알고리즘을 통해 결과를 출력해 보겠습니다. 주어진 배열을 정렬하기 위해 위에서 구현한 함수를 호출합니다.

let unsortedArray = [170, 45, 75, 90, 802, 24, 2, 66]
let sortedArray = radixSort(array: unsortedArray)

print("정렬된 배열: \(sortedArray)")

정리

기수 정렬은 특정 자릿값을 기준으로 데이터를 그룹핑하고 정렬하는 효과적인 방법입니다. 이 알고리즘을 통해 정수 배열을 오름차순으로 정렬할 수 있었습니다. 스위프트를 사용하여 기수 정렬을 구현하는 과정을 통해 알고리즘의 원리를 이해하고 어떻게 체계적으로 문제를 해결하는지를 배울 수 있었습니다.

참고 문헌

  • Introduction to Algorithms – Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest
  • GeeksforGeeks 기수 정렬 기사
  • Swift 공식 문서