[Kotlin] 이진 탐색 (Binary Search)

송규빈·2022년 6월 16일
0

개념

탐색 범위를 줄여나가며 특정 값을 찾아내는 알고리즘이다.
리스트가 정렬이 되어있어야만 한다는 단점이 있기는 하지만 순차 탐색에 비해 탐색 시간이 굉장히 빠르다.

업다운 게임을 해봤으면 알겠지만, 중간값을 외친 후 업다운을 듣고 또 그의 중간 값을 외치고 정해진 값을 찾는 것이 효율적이다.
이처럼 이진 탐색도 중간 값을 찾고 '다운'이라면 중간 값 기준으로 왼쪽(작은 쪽)에서의 중간 값을 찾으며 범위를 좁혀가고, '업'이라면 오른쪽(큰 쪽)으로 중간 값을 찾으며 범위를 점차 좁혀 원하는 값을 찾는다.

시간복잡도

순차 탐색 : O(n)
이진 탐색 : O(logn)

코드

 fun binarySearch(nums: IntArray, target: Int): Int {
    val answer = -1

    var low = 0
    var high = nums.lastIndex

    while (low <= high) {
        val mid = (low + high) / 2

        if (nums[mid] < target) {
            low = mid + 1
        } else if (nums[mid] > target) {
            high = mid - 1
        } else {
            return mid
        }
    }

    return answer
}

관련 문제

1. 수 찾기
2. 숫자 카드
3. 숫자 카드2
4. 랜선 자르기
5. 나무 자르기

profile
🚀 상상을 좋아하는 개발자

0개의 댓글