Swift Data Structure And Algorithm/Sort Algorithm

ํ€ต์ •๋ ฌ ๊ตฌํ˜„ํ•˜๊ธฐ

youngjaeLee1026 2022. 3. 31. 12:54

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 51 05

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 51 29

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 51 48

4. ๋ฌธ์ œ ์„ค๊ณ„

  1. pivot์ด ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ํ‰๊ท ์ ์œผ๋กœ O(n log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ ,
  2. ๋ฐฐ์—ด์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ(์ตœ์•…์˜ ๊ฒฝ์šฐ), O(n ^ 2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
  3. pivot์„ ๊ธฐ์ค€์œผ๋กœ ํฌ๊ณ  ์ž‘์€ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๊ณ , ๋‹ค์‹œ ํ€ต์ •๋ ฌํ•˜๋Š” ์žฌ๊ท€์ ์ธ ํŒจํ„ด์ด๋ฏ€๋กœ, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

5. ์ „์ฒด ์ฝ”๋“œ

//MARK: - ํ€ต์ •๋ ฌ ๊ตฌํ˜„ํ•˜๊ธฐ

//MARK: - Framework
import Foundation

//MARK: - Function
func getLeft(_ array: [Int], _ start: Int, _ end: Int, _ pivot: Int, _ left: inout [Int]) -> Int {
    var index: Int = 0
    for i in start...end {
        if array[i] <= pivot {
            left[index] = array[i]
            index += 1
        }
    }
    
    return index
}

func getRight(_ array: [Int], _ start: Int, _ end: Int, _ pivot: Int, _ right: inout [Int]) -> Int {
    var index: Int = 0
    for i in start...end {
        if array[i] > pivot {
            right[index] = array[i]
            index += 1
        }
    }
    
    return index
}

func quickSort(_ array: inout [Int], _ left: inout [Int], _ right: inout [Int], _ start: Int, _ end: Int) {
    //array์˜ start ๋ฒˆ ์งธ ๊ฐ’ ๋ถ€ํ„ฐ end ๋ฒˆ ์งธ ๊ฐ’ ๊นŒ์ง€ ํ€ต ์ •๋ ฌ ํ•˜๋Š” ํ•จ์ˆ˜
    if start >= end {
        return
    }
    
    let pivot: Int = array[start]
    let leftCount: Int = getLeft(array, start + 1, end, pivot, &left)
    let rightCount: Int = getRight(array, start + 1, end, pivot, &right)
    
    for i in 0..<leftCount {
        array[start + i] = left[i]
    }
    
    array[start + leftCount] = pivot
    
    for i in 0..<rightCount {
        array[start + leftCount + 1 + i] = right[i]
    }
    
    quickSort(&array, &left, &right, start, start + leftCount - 1)
    quickSort(&array, &left, &right, start + leftCount + 1, end)
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    guard let input = readLine()?.components(separatedBy: " ") else { return }
    
    var answer: String = ""
    var array: [Int] = input.map { Int($0) ?? 0 }
    var left: [Int] = Array(repeating: 0, count: N)
    var right: [Int] = Array(repeating: 0, count: N)
    
    //MARK: - Process
    quickSort(&array, &left, &right, 0, N - 1)
    
    for i in 0..<array.count - 1 {
        answer += "\(array[i]) "
    }
    answer += "\(array[array.count - 1])"
    
    //MARK: - Output
    print(answer)
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.