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()

 

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