Swift Data Structure And Algorithm/Binary Search

2차식 μ •λ‹΅ μΆ”μΈ‘

youngjaeLee1026 2022. 4. 2. 00:45

1. 문제

스크란샷 2022-04-02 00 37 59

2. μž…μΆœλ ₯

스크란샷 2022-04-02 00 38 14

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

스크란샷 2022-04-02 00 38 35

4. 문제 섀계

  1. 숫자 a의 μ΅œλŒ€κ°’μ„ 보면 19자리 μ΄λ―€λ‘œ, Int64 μžλ£Œν˜•μ— μ €μž₯ν•΄μ•Όν•˜λŠ” 것을 μ•Œ 수 있음
  2. f(x) = x ^ x + x 2차식을 κ³±μ…ˆ ν˜•νƒœλ‘œ λ³€ν˜•ν•˜κ²Œ 되면, f(x) = x * (x + 1)
  3. 즉, 자기 μžμ‹ κ³Ό μžμ‹ λ³΄λ‹€ 1큰 수의 곱을 톡해 aλ₯Ό λ§Œλ“€μ–΄λ‚΄μ•Ό λ˜λŠ” 것을 μ•Œ 수 있음
  4. 두 수의 곱을 톡해 aλ₯Ό μ–»μ–΄λ‚΄μ•Ό ν•˜λ―€λ‘œ, 완전탐색을 ν•˜κ²Œ λœλ‹€λ©΄ O(N)으둜 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŒ
  5. λ”°λΌμ„œ 이진탐색을 톡해 0λΆ€ν„° a의 제곱근 + 1κΉŒμ§€μ˜ 수λ₯Ό x * (x + 1) μ—°μ‚° ν•¨μœΌλ‘œμ¨ 값을 μ–»μ–΄λ‚Ό 수 있음

5. 전체 μ½”λ“œ

//MARK: - 2차식 μ •λ‹΅ μΆ”μΈ‘

//MARK: - Framework
import Foundation

//MARK: - Function
func binarySearch(_ start: Int64, _ end: Int64, _ value: Int64) -> Int64 {
    if start + 1 >= end {
        return start
    }
    
    let x: Int64 = (start + end) / 2
    return x * (x + 1) <= value ? binarySearch(x, end, value) : binarySearch(start, x, value)
}

func solution() -> Void {
    //MARK: - Input
    guard let a: Int64 = Int64(readLine() ?? "0") else { return }
    
    //MARK: - Process
    let result: Int64 = binarySearch(0, Int64(sqrt(Double(a))) + 1, a)
    
    //MARK: - Output
    print(result)
}
solution()

 

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