Swift Data Structure And Algorithm/Sort Algorithm

ํ•ฉ๋ณ‘์ •๋ ฌ ๊ตฌํ˜„ํ•˜๊ธฐ

youngjaeLee1026 2022. 3. 31. 12:50

1. ๋ฌธ์ œ

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

2. ์ž…์ถœ๋ ฅ

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

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

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

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

  1. O(n log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„, ํ•ฉ๋ณ‘์ •๋ ฌ
  2. ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋‹ค์‹œ ํ•ฉ๋ณ‘์ •๋ ฌํ•˜๋Š” ์žฌ๊ท€์ ์ธ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  3. ์›์†Œ๊ฐ€ 1๊ฐœ๊ฐ€ ๋  ๋•Œ ๊นŒ์ง€ ๋‚˜๋ˆ„๊ณ (๊ธฐ์ € ์กฐ๊ฑด), ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž„์‹œ ๋ฐฐ์—ด์— ์›์†Œ๋ฅผ ํ•ฉ์น˜๊ณ 
  4. ๋‹ค์‹œ ์›๋ž˜์˜ ๋ฐฐ์—ด์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

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

//MARK: - ํ•ฉ๋ณ‘์ •๋ ฌ ๊ตฌํ˜„ํ•˜๊ธฐ

//MARK: - Framework
import Foundation

//MARK: - Variable
var tempArray: [Int] = []

//MARK: - Function
func merging(_ array: inout [Int], _ s1: Int, _ e1: Int, _ s2: Int, _ e2: Int) -> Void {
    var p: Int = s1
    var q: Int = s2
    var index: Int = 0
    
    while p <= e1 && q <= e2 {
        if array[p] <= array[q] {
            tempArray[index] = array[p]
            p += 1
        } else {
            tempArray[index] = array[q]
            q += 1
        }
        index += 1
    }
    
    if p > e1 {
        for i in q...e2 {
            tempArray[index] = array[i]
            index += 1
        }
    } else {
        for i in p...e1 {
            tempArray[index] = array[i]
            index += 1
        }
    }
    
    for i in s1...e2 {
        array[i] = tempArray[i - s1]
    }
}

func mergeSort(_ array: inout [Int], _ start: Int, _ end: Int) -> Void {
    //array์˜ start ๋ฒˆ ์งธ ๊ฐ’ ๋ถ€ํ„ฐ end ๋ฒˆ ์งธ ๊ฐ’ ๊นŒ์ง€ ํ•ฉ๋ณ‘์ •๋ ฌ ํ•˜๋Š” ํ•จ์ˆ˜
    if start >= end {
        return
    }
    
    let mid: Int = (start + end) / 2
    mergeSort(&array, start, mid)
    mergeSort(&array, mid + 1, end)
    
    merging(&array, start, mid, mid + 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 }
    tempArray = Array(repeating: 0, count: n)
    
    //MARK: - Process
    mergeSort(&array, 0, n - 1)
    
    for i in 0..<array.count - 1 {
        answer += "\(array[i]) "
    }
    answer += "\(array[array.count - 1])"
    
    //MARK: - Output
    print(answer)
}
solution()

 

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