안녕하세요! 오늘은 스위프트를 사용한 기수 정렬(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 공식 문서