Swift Data Structure And Algorithm/Binary Search

κ΅¬κ°„μ˜ ν•©μ§‘ν•©

youngjaeLee1026 2022. 4. 2. 01:22

1. 문제

스크란샷 2022-04-02 01 13 26

2. μž…μΆœλ ₯

스크란샷 2022-04-02 01 13 42

3. μž…μΆœλ ₯ μ˜ˆμ‹œ

스크란샷 2022-04-02 01 13 58

4. 문제 섀계

  • i의 λ²”μœ„λ₯Ό 보더라도 μ™„μ „νƒμƒ‰μœΌλ‘œ μ ˆλŒ€ μ‹œκ°„μ•ˆμ— 문제λ₯Ό ν•΄κ²°ν•  수 μ—†λŠ” 것을 μ•Œ 수 있음
  • λ”°λΌμ„œ 더 효율적인 탐색 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•˜κ³ , 각각의 μ‹œμž‘μ κ³Ό 끝점을 μ €μž₯ν•˜λŠ” 2차원 배열을 κ΅¬μ„±ν•˜κ±°λ‚˜,
  • 각각을 1차원 배열에 μ €μž₯ν•˜λŠ” 방법도 있음, μ΄λ•Œ μ‹œμž‘μ  끝점을 μž…λ ₯λ°›μ•„ 각각 배열에 μ €μž₯ν•  λ•Œ O(n)으둜 μ €μž₯ν•΄μ•Ό ν•˜λŠ” 것에 유의 해야함
  • λͺ¨λ“  μ‹œμž‘μ κ³Ό 끝점의 정보가 μ €μž₯λ˜μ–΄ μžˆλŠ” 배열을 O(n)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μ΅œμ†Œ μ‹œμž‘μ , μ΅œλŒ€ 끝점을 각각 κ΅¬ν•˜κ³ ,
  • μ΅œμ†Œ μ‹œμž‘μ λΆ€ν„° μ΅œλŒ€ 끝점에 λŒ€ν•΄ 이진탐색을 톡해 문제λ₯Ό ν•΄κ²°ν•  수 있음
  • λͺ¨λ“  κ΅¬κ°„μ˜ 합집합에 λŒ€ν•΄ O(n)의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ μ΅œμ†Œ μ‹œμž‘μ μ—μ„œ μ΅œλŒ€ 끝점 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” 각각의 숫자의 μœ„μΉ˜λ₯Ό μ•Œμ•„λ‚Ό 수 있음
  • μ΅œμ†Œ μ‹œμž‘μ μ—μ„œ μ΅œλŒ€ 끝점에 λŒ€ν•΄ 쀑간 값이 각각의 κ΅¬κ°„μ˜ 끝점보닀 크면 각 κ΅¬κ°„μ˜ 끝점과 μ‹œμž‘μ μ˜ 차이λ₯Ό 톡해 ν˜„μž¬ 쀑간 값보닀 μž‘μ€ 수의 개수λ₯Ό μ•Œ 수 있고,
  • 쀑간 값보닀 각 κ΅¬κ°„μ˜ 끝점이 μž‘κ±°λ‚˜ κ°™λ‹€λ©΄, 쀑간 값이 μ‹œμž‘μ λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μœΌλ©΄ μž‘μ€ μˆ«μžκ°€ μ—†κ³ , 쀑간 값이 μ‹œμž‘μ  보닀 크닀면 쀑간 κ°’κ³Ό μ‹œμž‘μ μ˜ 차이λ₯Ό 톡해 μž‘μ€ 개수λ₯Ό μ•Œ 수 있음
  • μœ„ 과정을 톡해 얻은 μž‘μ€ 수의 κ°œμˆ˜κ°€ ν•΄λ‹Ή 수의 μœ„μΉ˜μž„μ„ μ•Œ 수 있고, 이 수λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚Όμ•„ 이진탐색을 ν•˜κ²Œ 되면 
  • O(n log n)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음(μ΄λ•Œ, μœ„μΉ˜μ— λŒ€ν•œ 값은 Int64 μžλ£Œν˜•μœΌλ‘œ μ €μž₯ ν•΄μ£Όμ–΄μ•Ό 함)

5. 전체 μ½”λ“œ

//MARK: - κ΅¬κ°„μ˜ ν•©μ§‘ν•©

//MARK: - Framework
import Foundation

//MARK: - Function
func getMax(_ array: [[Int]], _ n: Int) -> Int {
    var result: Int = array[0][1]
    for i in 1..<n {
        result = array[i][1] > result ? array[i][1] : result
    }
        
    return result
}

func getMin(_ array: [[Int]], _ n: Int) -> Int {
    var result: Int = array[0][0]
    for i in 1..<n {
        result = array[i][0] < result ? array[i][0] : result
    }
    
    return result
}

func getOrder(_ array: [[Int]], _ n: Int, _ number: Int) -> Int64 {
    var result: Int64 = 0
    for i in 0..<n {
        if number > array[i][1] {
            result += Int64(array[i][1] - array[i][0] + 1)
        } else {
            result += number <= array[i][0] ? 0 : Int64(number - array[i][0])
        }
    }
    
    return result
}

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

func solution() -> Void {
    //MARK: - Input
    guard let n: Int = Int(readLine() ?? "0") else { return }
    
    var array: [[Int]] = Array(repeating: Array(repeating: 0, count: 2), count: n)
    for i in 0..<n {
        guard let input = readLine()?.components(separatedBy: " ") else { return }
        let s: Int = input.map { Int($0) }[0] ?? 0
        let e: Int = input.map {Int($0) }[1] ?? 0
        
        array[i][0] = s
        array[i][1] = e
    }
    
    guard let i: Int64 = Int64(readLine() ?? "0") else { return }
    let start: Int = getMin(array, n)
    let end: Int = getMax(array, n)
    
    //MARK: - Process
    let result: Int = binarySearch(array, n, start, end + 1, i)
    
    //MARK: - Output
    print(result)
    
}
solution()

 

μ „μ²΄μ½”λ“œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

'Swift Data Structure And Algorithm > Binary Search' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

쀑볡 μ—†λŠ” ꡬ간  (0) 2022.04.02
NNλ‹¨ν‘œ  (0) 2022.04.02
λ‚˜λ¬΄ 자λ₯΄κΈ°  (0) 2022.04.02
2차식 μ •λ‹΅ μΆ”μΈ‘  (0) 2022.04.02
두 μš©μ•‘  (0) 2022.04.02