Swift Data Structure And Algorithm/Binary Search

๋‘ ์šฉ์•ก

youngjaeLee1026 2022. 4. 2. 00:37

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-02 00 29 09

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-02 00 29 51

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

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-02 00 30 08

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

  1. ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๊ฐ๊ฐ ์ฐจ์ด๋ฅผ ๊ตฌํ•˜์—ฌ 0์— ๊ฐ€๊นŒ์šด์ง€ ๊ฒ€์‚ฌํ•˜๋ฉด O(100,000 * 100,000)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์†Œ์š”ํ•˜๊ฒŒ ๋จ
  2. ๋”ฐ๋ผ์„œ ๋จผ์ € ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ํ›„, 0๋ฒˆ ์ˆซ์ž๋ถ€ํ„ฐ ํ•ด๋‹น ์ˆซ์ž์˜ ๋ฐ˜๋Œ€ ๋ถ€ํ˜ธ(1์ธ ๊ฒฝ์šฐ -1, -1์ธ ๊ฒฝ์šฐ 1) ์ˆซ์ž์™€ ์ฐจ์ด๊ฐ€ ์ž‘์€ ์ˆซ์ž๋ฅผ ์ด์ง„ํƒ์ƒ‰์„ ํ†ตํ•ด ์ฐพ์•„์•ผ ํ•จ
  3. ๋ฐฐ์—ด์˜ ์›์†Œ์˜ ๊ฐ’์ด 10์–ต์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ Int64 ์ž๋ฃŒํ˜•์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ
  4. ํ˜„์žฌ ์ˆซ์ž์˜ ๋ฐ˜๋Œ€ ๋ถ€ํ˜ธ ์ˆซ์ž๋ณด๋‹ค ์ค‘๊ฐ„ ๊ฐ’์ด ์ž‘์€ ๊ฒฝ์šฐ start๋ฅผ ์˜ฎ๊ธฐ๊ณ , ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” end๋ฅผ ์˜ฎ๊ฒจ ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๋งž๋ถ™์—ˆ์„ ๋•Œ,
  5. start์™€ ํ˜„์žฌ ์ˆซ์ž์˜ ์ฐจ์ด(์ ˆ๋Œ€๊ฐ’)์™€ end์™€ ํ˜„์žฌ ์ˆซ์ž์˜ ์ฐจ์ด(์ ˆ๋Œ€๊ฐ’)์ด ๋” ์ž‘์€ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ฐ๊ฐ์„ ๋ฐฐ์—ด์— ์ €์žฅํ•จ
  6. ์›๋ž˜์˜ ๋ฐฐ์—ด๊ณผ ์ด์ง„ํƒ์ƒ‰์„ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋ฐฐ์—ด์˜ ํ•ฉ์˜ ์ ˆ๋Œ€๊ฐ’์—์„œ ์ตœ์†Œ๊ฐ’์˜ index๋ฅผ ์ฐพ์•„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

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

//MARK: - ๋‘ ์šฉ์•ก

//MARK: - Framework
import Foundation

//MARK: - Function
func getAbs(_ number: Int64) -> Int64 {
    return number < 0 ? number * -1 : number
}

func binarySearch(_ array: [Int], _ start: Int, _ end: Int, _ value: Int) -> Int {
    if start + 1 >= end {
        return getAbs(Int64(array[start] - value)) < getAbs(Int64(array[end] - value)) ? array[start] : array[end]
    }
    
    let mid: Int = (start + end) / 2
    return array[mid] < value ? binarySearch(array, mid, end, value) : binarySearch(array, start, mid, value)
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    guard let inputArray: [String] = readLine()?.components(separatedBy: " ") else { return }
    
    let array: [Int] = inputArray.map { Int($0) ?? 0 }.sorted { $0 < $1 }
    var A: [Int] = []
    var B: [Int] = []
    var min: Int64 = 0
    var minIndex: Int = 0
    
    //MARK: - Process
    for i in 0..<N - 1 {
        A.append(array[i])
    }
    
    for i in 0..<N - 1 {
        B.append(binarySearch(array, i + 1, N - 1, A[i] * -1))
    }
    
    min = getAbs(Int64(A[0] + B[0]))
    for i in 1..<N - 1 {
        if min > getAbs(Int64(A[i] + B[i])) {
            min = getAbs(Int64(A[i] + B[i]))
            minIndex = i
        }
    }
    
    //MARK: - Output
    print(A[minIndex] < B[minIndex] ? "\(A[minIndex]) \(B[minIndex])" : "\(B[minIndex]) \(A[minIndex])")
}
solution()

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

'Swift Data Structure And Algorithm > Binary Search' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋‚˜๋ฌด ์ž๋ฅด๊ธฐ  (0) 2022.04.02
2์ฐจ์‹ ์ •๋‹ต ์ถ”์ธก  (0) 2022.04.02
์ˆซ์ž ๊ฐœ์ˆ˜ ์„ธ๊ธฐ  (0) 2022.04.02
์ˆซ์ž๋ฐ•์Šค  (0) 2022.04.02
์ด์ง„ํƒ์ƒ‰  (0) 2022.04.02