이번에는 이분탐색(Binary Search)에 대해 알아보자.
이분탐색은 효율적인 검색 알고리즘 중 하나로, 이미 정렬된 배열이나 리스트에서 특정 값을 찾는 데 사용된다.
이분탐색은 배열의 가운데 있는 요소와 비교하여, 찾고자 하는 값이 가운데 값보다 작은지, 큰지를 확인한 후 배열을 반으로 나누어 검색 범위를 줄여가는 방법이다.
이 과정이 반복되면서 검색 범위가 점점 좁아지며, 결국 원하는 값을 찾거나, 배열에 값이 없는 경우 탐색을 종료한다.
이분탐색은 다음과 같은 단계로 동작한다:
이분탐색의 시간 복잡도는 O(log n)이다. 이는 검색 범위를 절반씩 줄여 나가기 때문에 매우 효율적이다.
하지만, 배열이 반드시 정렬되어 있어야 한다는 전제가 필요하다.
아래는 이분탐색을 구현한 간단한 예제 코드이다.
이 코드에서는 정렬된 정수 배열에서 특정 값을 찾는 기능을 구현했다.
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");
}
}
}
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");
}
}
}
이분탐색은 매우 중요한 알고리즘이며, 이를 활용한 다양한 문제가 존재한다.
예를 들어, 최소 최대 문제, 이진 검색 트리 (BST), 순위 매기기 문제 등이 있다.
이분탐색의 기본 원리를 이해하고 응용할 수 있다면, 알고리즘 문제를 해결하는 데 큰 도움이 될 것이다.
이제 이분탐색에 대해 이해가 되었으리라 믿는다.
이 알고리즘을 잘 활용하면, 효율적으로 문제를 해결할 수 있을 것이다.