1. λ¬Έμ
2. μ μΆλ ₯
3. μ μΆλ ₯ μμ
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 |