κΉ¨μ•Œ κ°œλ… πŸ“‘/μ•Œκ³ λ¦¬μ¦˜

이진 탐색 (Binary search)

interfacer_han 2023. 11. 6. 13:29

#1 μ•Œκ³ λ¦¬μ¦˜

#1-1

 

#1-2

μ΄λ ‡κ²Œ ν•΄μ„œ x의 인덱슀 iλ₯Ό 찾으면 μ’‹κ² μ§€λ§Œ, 이 xκ°€ λ°°μ—΄ values 어디에도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆμ„ 것이닀. 이 κ²½μš°μ—” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν• κΉŒ?

 

#1-3

μ—… μ•€ λ‹€μš΄ κ²Œμž„μ€ μš°λ¦¬λ‚˜λΌμ—μ„  μ†Œμ£Όλ³‘ λšœκ»‘μ— μ ν˜€ μžˆλŠ” 0 ~ 50 μ‚¬μ΄μ˜ μ •μˆ˜λ₯Ό κ°€μ§€κ³  λ§žμΆ”λŠ” 술 κ²Œμž„μ˜ 이미지가 κ°•ν•˜λ‹€. μ–΄λ–€ 상황을 가정해보겠닀. μ–΄λŠ λ³‘λšœκ»‘μ—” μ•Œ 수 μ—†λŠ” 이유둜 34.5λΌλŠ” μ •μˆ˜κ°€ μ•„λ‹Œ μˆ˜κ°€ μ ν˜€ μžˆμ—ˆλ‹€.β€¨μ‚¬νšŒμžλŠ” λ³‘λšœκ»‘μ— 쓰인 숫자λ₯Ό 보고 λ‹Ήν™©ν–ˆμ§€λ§Œ, μž₯λ‚œκΈ°κ°€ λ°œλ™ν•΄ κ·Έλƒ₯ κ²Œμž„μ„ μ§„ν–‰ν•΄ 보기둜 ν–ˆλ‹€. μ°Έμ—¬μžλ“€μ€ λ³‘λšœκ»‘μ— 쓰인 μˆ«μžκ°€ μ •μˆ˜κ°€ 아닐 κ±°λΌκ³ λŠ” 생각지 λͺ»ν•˜κ³  μ—… μ•€ λ‹€μš΄ κ²Œμž„μ— μž„ν•  것이닀. 이 μ—… μ•€ λ‹€μš΄ κ²Œμž„μ€ μ‹€νŒ¨ν•  운λͺ…이닀. ν•˜μ§€λ§Œ, 이 사둀λ₯Ό 상상해 λ³΄λ©΄μ„œ 이진 탐색이 μ‹€νŒ¨ν–ˆμŒμ„ μ–΄λ–»κ²Œ νŒλ‹¨ν•  것인가λ₯Ό λ„μΆœν•΄ λ‚Ό 수 μžˆλ‹€.

 

#1-4

Up이라고 νŒλ‹¨ν•˜λŠ” 기쀀인 value[mid] < x의 μ˜λ―ΈλŠ” xκ°’μ˜ μΈλ±μŠ€ iκ°€ mid보닀 크닀(Up)λŠ” μ˜λ―Έλ‹€. iλŠ” binarySearch()μ—μ„œ λ°˜ν™˜(return)ν•  값이닀.

 

#1-5

 

μ€‘λ³΅λœ μ›μ†Œ 값이 μžˆλŠ” 경우의 이진 탐색 (Binary Search)

#1 μ•Œκ³ λ¦¬μ¦˜ 이진 탐색 (Binary search) #1 μ•Œκ³ λ¦¬μ¦˜ μ΄λ ‡κ²Œ ν•΄μ„œ x의 인덱슀 iλ₯Ό 찾으면 μ’‹κ² μ§€λ§Œ, 이 xκ°€ λ°°μ—΄ values 어디에도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆμ„ 것이닀. 이 κ²½μš°μ—” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν• κΉŒ? μ—…

kenel.tistory.com

values에 μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μžˆλŠ” 경우의 μ•Œκ³ λ¦¬μ¦˜

 

#2 μ½”λ“œ

#2-1 μžλ°”

private static int binarySearch(int[] values, int x) {
    int min = 0;
    int max = values.length - 1;
            
    while (min <= max) {
        int mid = (min + max) / 2; // int끼리 λ‚˜λˆ„λ©΄ μ†Œμˆ˜μ  μ•„λž˜λŠ” 버렀진닀. (반올림 μ•„λ‹˜)
        
        // up
        if (values[mid] < x) {
            min = mid + 1;
        
        // equal
        } else if (values[mid] == x) {
            return mid;
            
        // down    
        } else { // values[mid] > x
            max = mid - 1;
        }
    }
    
    return -1;
}

 

#2-2 μ½”ν‹€λ¦°

fun binarySearch(values : Array<Int>, x : Int) : Int {
    var min = 0
    var max = values.size - 1

    while(min <= max) {
        val mid = (min + max) / 2

        // up
        if(values[mid] < x) {
            min = mid + 1
        
        // equal
        } else if(values[mid] == x) {
            return mid

        // down
        } else { // values[mid] > x
            max = mid - 1
        }
    }

    return -1
}

 

#3 μš”μ•½

이진 탐색은 μ—… μ•€ λ‹€μš΄ κ²Œμž„μ΄λ‹€.