youngjaeLee1026 2022. 4. 2. 01:04

1. 문제

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

2. μž…μΆœλ ₯

스크란샷 2022-04-02 01 03 00

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

스크란샷 2022-04-02 01 03 21

4. 문제 섀계

  1. O(N^2) 완전탐색을 톡해 문제λ₯Ό ν•΄κ²°ν•˜κ²Œ 되면 100,000 * 100,000μ΄λ―€λ‘œ μ‹œκ°„μ•ˆμ— 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŒ
  2. μš°λ¦¬κ°€ μ•Œ 수 μžˆλŠ” μˆ˜λŠ” 1 ~ N * N λ²”μœ„μ˜ 수이고, ν•΄λ‹Ή λ²”μœ„μ˜ μˆ˜κ°€ λͺ‡ 번째 μˆ˜μΈμ§€ O(N)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μ•Œμ•„λ‚Ό 수 있음
  3. NNλ‹¨ν‘œμ—μ„œ 1λΆ€ν„° NκΉŒμ§€ 쀑, 1 * N이 ν˜„μž¬ μˆ˜λ³΄λ‹€ μž‘κ²Œ 되면 ν˜„μž¬μ˜ λ‹¨κ³„μ—μ„œλŠ” ν˜„μž¬ μˆ«μžλ³΄λ‹€ μž‘μ€ μˆ«μžκ°€ Nκ°œκ°€ μžˆλ‹€λŠ” 것을 μ•Œ 수 있고,
  4. ν˜„μž¬ μˆ«μžκ°€ ν˜„μž¬ λ‹¨κ³„λ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ λœλ‹€λ©΄ κ·Έ λͺ«μ—μ„œ 자기 μžμ‹ μ„ μ œμ™Έν•˜κ²Œ 되면 ν˜„μž¬ μˆ«μžλ³΄λ‹€ μž‘μ€ 숫자의 개수λ₯Ό μ•Œ 수 있고,
  5. λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€λ©΄, κ·Έ λͺ«μ΄ ν˜„μž¬ μˆ«μžλ³΄λ‹€ μž‘μ€ 숫자의 κ°œμˆ˜μž„μ„ μ•Œ 수 있음
  6. μœ„ 3 ~ 5 κ³Όμ •μ˜ 개수λ₯Ό λͺ¨λ‘ 더해 + 1을 λ°˜ν™˜ν•˜κ²Œ 되면 O(N)λ§Œμ— 1 ~ N * N숫자의 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” 각각의 μˆ«μžκ°€ λͺ‡ 번째 μˆ«μžμΈμ§€ μ•Œ 수 있음
  7. 이λ₯Ό 톡해 ν˜„μž¬ 찾고자 ν•˜λŠ” 숫자의 μœ„μΉ˜ K와 λΉ„κ΅ν•˜μ—¬ 이진탐색을 톡해 O(N log N)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - NNλ‹¨ν‘œ

//MARK: - Framework
import Foundation

//MARK: - Function
func getOrder(_ N: Int, _ number: Int64) -> Int64 {
    var result: Int64 = 0
    for i in 1...N {
        if i * N < number {
            result += Int64(N)
        } else {
            result += number % Int64(i) == 0 ? number / Int64(i) - 1 : number / Int64(i)
        }
    }
    result += 1
    
    return result
}

func binarySearch(_ N: Int, _ start: Int64, _ end: Int64, _ K: Int64) -> Int64 {
    if start + 1 >= end {
        return start
    }
    
    let mid: Int64 = (start + end) / 2
    return getOrder(N, mid) <= K ? binarySearch(N, mid, end, K) : binarySearch(N, start, mid, K)
}

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

 

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