Swift Data Structure And Algorithm/Binary Search

์ˆซ์ž ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

youngjaeLee1026 2022. 4. 2. 00:28

1. ๋ฌธ์ œ

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

2. ์ž…์ถœ๋ ฅ

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

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

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

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

  1. n(100,000)๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด q(100,000)๋ฒˆ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋ฉด, O(100,000 * 100,000)์œผ๋กœ ์‹œ๊ฐ„ ์•ˆ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Œ
  2. ๋”ฐ๋ผ์„œ n(100,000)๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด ๊ณ ๊ธ‰ ์ •๋ ฌ์„ ํ†ตํ•ด O(n log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋˜๊ณ , ์ดํ›„ q๋ฒˆ์˜ ์ด์ง„ํƒ์ƒ‰ O(q log n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋จ
  3. ์ด ๋ฌธ์ œ๋Š” ์ด์ง„ํƒ์ƒ‰์„ ๋‘ ๋ฒˆ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ•œ ๋ฒˆ์€ ํ˜„์žฌ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด mid๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ, end๋ฅผ ์ด๋™ ์‹œ์ผœ ํˆฌ ํฌ์ธํ„ฐ(start์™€ end๊ฐ€ ๋ถ™๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ์ฆ‰, start + 1 == end ์ผ ๋•Œ)๊ฐ€ ๋งž๋ถ™์—ˆ์„ ๋•Œ, end๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ˆซ์ž์˜ ๊ฐ€์žฅ ์ž‘์€ index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ ,
  4. ๋งˆ์ง€๋ง‰ ํ•œ ๋ฒˆ์€ ํ˜„์žฌ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด mid๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ, start๋ฅผ ์ด๋™ ์‹œ์ผœ ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๋งž๋ถ™์—ˆ์„ ๋•Œ, start๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ˆซ์ž์˜ ๊ฐ€์žฅ ํฐ index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ
  5. ๊ฐ€์žฅ ํฐ index์—์„œ ๊ฐ€์žฅ ์ž‘์€ index์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ์ˆ˜์—ด์— ๋ช‡๊ฐœ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ

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

//MARK: - ์ˆซ์ž ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

//MARK: - Framework
import Foundation

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

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

func solution() -> Void {
    //MARK: - Input
    guard let input = readLine()?.components(separatedBy: " ") else { return }
    guard let inputArray = readLine()?.components(separatedBy: " ") else { return }
    guard let inputQuestions = readLine()?.components(separatedBy: " ") else { return }
    
    let n: Int = input.map { Int($0) }[0] ?? 0
    let _: Int = input.map { Int($0) }[1] ?? 0
    let array: [Int] = inputArray.map { Int($0) ?? 0}.sorted { $0 < $1 }
    let questions: [Int] = inputQuestions.map { Int($0) ?? 0 }
    var answer: String = ""
    
    //MARK: - Process
    for question in questions {
        let maxIndex: Int = maxBinarySearch(array, 0, n, question)
        let minIndex: Int = minBinarySearch(array, -1, n - 1, question)
        
        answer += "\(maxIndex - minIndex + 1)\n"
    }
    
    //MARK: - Output
    print(answer)
}
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