Gihak111 Navbar

Binary Search

이번에는 이분탐색(Binary Search)에 대해 알아보자.
이분탐색은 효율적인 검색 알고리즘 중 하나로, 이미 정렬된 배열이나 리스트에서 특정 값을 찾는 데 사용된다.

이분탐색(Binary Search)

이분탐색은 배열의 가운데 있는 요소와 비교하여, 찾고자 하는 값이 가운데 값보다 작은지, 큰지를 확인한 후 배열을 반으로 나누어 검색 범위를 줄여가는 방법이다.
이 과정이 반복되면서 검색 범위가 점점 좁아지며, 결국 원하는 값을 찾거나, 배열에 값이 없는 경우 탐색을 종료한다.

이분탐색의 동작 원리

이분탐색은 다음과 같은 단계로 동작한다:

  1. 배열의 중간 값을 찾는다.
  2. 중간 값이 찾고자 하는 값과 같은지 확인한다.
  3. 중간 값이 찾고자 하는 값보다 크다면, 배열의 왼쪽 절반에서 검색을 계속한다.
  4. 중간 값이 찾고자 하는 값보다 작다면, 배열의 오른쪽 절반에서 검색을 계속한다.
  5. 이 과정을 반복하여 값을 찾거나 배열의 범위가 없어질 때까지 진행한다.

이분탐색의 시간 복잡도

이분탐색의 시간 복잡도는 O(log n)이다. 이는 검색 범위를 절반씩 줄여 나가기 때문에 매우 효율적이다.
하지만, 배열이 반드시 정렬되어 있어야 한다는 전제가 필요하다.

예제 코드

아래는 이분탐색을 구현한 간단한 예제 코드이다.
이 코드에서는 정렬된 정수 배열에서 특정 값을 찾는 기능을 구현했다.

  1. 이분탐색 구현 예제 (재귀 방식)
    public class BinarySearchRecursive {
    
     public static int binarySearch(int[] arr, int target, int left, int right) {
         if (left > right) {
             return -1;  // 값이 배열에 없음
         }
    
         int mid = left + (right - left) / 2;
    
         // 중간 값이 타겟과 같은 경우
         if (arr[mid] == target) {
             return mid;
         }
    
         // 타겟이 중간 값보다 작은 경우, 왼쪽 반에서 검색
         if (arr[mid] > target) {
             return binarySearch(arr, target, left, mid - 1);
         }
    
         // 타겟이 중간 값보다 큰 경우, 오른쪽 반에서 검색
         return binarySearch(arr, target, mid + 1, right);
     }
    
     public static void main(String[] args) {
         int[] sortedArray = {1, 3, 5, 7, 9, 11, 13};
         int target = 7;
    
         int result = binarySearch(sortedArray, target, 0, sortedArray.length - 1);
    
         if (result != -1) {
             System.out.println("Element found at index: " + result);  // 출력: Element found at index: 3
         } else {
             System.out.println("Element not found");
         }
     }
    }
    
  2. 이분탐색 구현 예제 (반복문 방식)
public class BinarySearchIterative {

    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // 중간 값이 타겟과 같은 경우
            if (arr[mid] == target) {
                return mid;
            }

            // 타겟이 중간 값보다 작은 경우, 왼쪽 반에서 검색
            if (arr[mid] > target) {
                right = mid - 1;
            }
            // 타겟이 중간 값보다 큰 경우, 오른쪽 반에서 검색
            else {
                left = mid + 1;
            }
        }

        return -1;  // 값이 배열에 없음
    }

    public static void main(String[] args) {
        int[] sortedArray = {2, 4, 6, 8, 10, 12, 14};
        int target = 10;

        int result = binarySearch(sortedArray, target);

        if (result != -1) {
            System.out.println("Element found at index: " + result);  // 출력: Element found at index: 4
        } else {
            System.out.println("Element not found");
        }
    }
}

이분탐색 사용 사례

이제 이분탐색에 대해 이해가 되었으리라 믿는다.
이 알고리즘을 잘 활용하면, 효율적으로 문제를 해결할 수 있을 것이다.