Swift Data Structure And Algorithm/Binary Search
μ«μ κ°μ μΈκΈ°
youngjaeLee1026
2022. 4. 2. 00:28
1. λ¬Έμ
2. μ μΆλ ₯
3. μ μΆλ ₯ μμ
4. λ¬Έμ μ€κ³
- n(100,000)κ°μ μ«μμ λν΄ q(100,000)λ² μ«μμ κ°μλ₯Ό νμνκ² λλ©΄, O(100,000 * 100,000)μΌλ‘ μκ° μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ
- λ°λΌμ n(100,000)κ°μ μ«μμ λν΄ κ³ κΈ μ λ ¬μ ν΅ν΄ O(n log n) μκ° λ³΅μ‘λκ° μμλκ³ , μ΄ν qλ²μ μ΄μ§νμ O(q log n)μ μκ°λ³΅μ‘λκ° μμλ¨
- μ΄ λ¬Έμ λ μ΄μ§νμμ λ λ² ν΄μΌ νλλ°, ν λ²μ νμ¬ μ°Ύκ³ μ νλ κ°μ΄ midλ³΄λ€ ν¬κ±°λ κ°μ κ²½μ°, endλ₯Ό μ΄λ μμΌ ν¬ ν¬μΈν°(startμ endκ° λΆκ² λμμ λ μ¦, start + 1 == end μΌ λ)κ° λ§λΆμμ λ, endλ₯Ό λ°ννκ² λλ©΄ ν΄λΉ μ«μμ κ°μ₯ μμ indexλ₯Ό λ°ννκ² λκ³ ,
- λ§μ§λ§ ν λ²μ νμ¬ μ°Ύκ³ μ νλ κ°μ΄ midλ³΄λ€ μκ±°λ κ°μ κ²½μ°, startλ₯Ό μ΄λ μμΌ ν¬ ν¬μΈν°κ° λ§λΆμμ λ, startλ₯Ό λ°ννκ² λλ©΄ ν΄λΉ μ«μμ κ°μ₯ ν° indexλ₯Ό λ°ννκ² λ¨μΌλ‘μ¨
- κ°μ₯ ν° 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()
μ 체μ½λλ μ¬κΈ°μμ νμΈν μ μμ΅λλ€.