youngjaeLee1026 2022. 4. 2. 00:16

1. 문제

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

2. μž…μΆœλ ₯

스크란샷 2022-04-02 00 10 28

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

스크란샷 2022-04-02 00 10 45

4. 문제 섀계

  1. N(300,000)개의 μˆ«μžμ— λŒ€ν•΄ M(500,000)번의 탐색을 ν•˜κ²Œ 되면, 300,000 * 500,000 = 150,000,000,000 μ΄λ―€λ‘œ,
  2. μ‹œκ°„μ•ˆμ— 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŒ. λ”°λΌμ„œ λ‹€λ₯Έ 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό 함
  3. N(300,000)개의 μˆ«μžμ— λŒ€ν•΄ 정렬을 ν•˜κ²Œ 되면 합병 μ •λ ¬, 퀡정렬 λ“± κ³ κΈ‰ 정렬을 톡해 O(N log N)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 정렬을 ν•  수 있고,
  4. 이미 μ •λ ¬λœ μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄ 이진탐색을 ν•˜κ²Œ 되면 O(log N)이고 이λ₯Ό M(500,000)번 λ°˜λ³΅ν•˜κ²Œ 되면,
  5. O(N log N) + O(M log N)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - μˆ«μžλ°•μŠ€

//MARK: - Framework
import Foundation

//MARK: - Function
func binarySearch(_ array: [Int], _ start: Int, _ end: Int, _ value: Int) -> Bool {
    if start >= end {
        return array[start] == value ? true : false
    }
    
    let mid = (start + end) / 2
    if array[mid] == value {
        return true
    }
    
    return array[mid] < value ? binarySearch(array, mid + 1, end, value) : binarySearch(array, start, mid - 1, value)
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    guard let inputArray = readLine()?.components(separatedBy: " ") else { return }
    guard let _: Int = Int(readLine() ?? "0") else { return }
    guard let inputCandidates = readLine()?.components(separatedBy: " ") else { return }
    
    let array: [Int] = inputArray.map { Int($0) ?? 0 }.sorted { $0 < $1 }
    let candidates: [Int] = inputCandidates.map { Int($0) ?? 0 }
    var answer: String = ""
    
    //MARK: - Process
    for candidate in candidates {
        answer += binarySearch(array, 0, N - 1, candidate) ? "\(1)\n" : "\(0)\n"
    }
    
    //MARK: - Output
    print(answer)
    
}
solution()

 

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