[알고리즘] 이진 탐색(Binary Search) 개념 및 구현
📌 이진 탐색(Binary Search)이란?
이진 탐색은 정렬된 배열에서 **탐색 범위를 반씩 줄여가며 값을 찾는 알고리즘**입니다.
탐색할 데이터가 많을 경우, **선형 탐색(순차 탐색)보다 훨씬 빠르게 원하는 값을 찾을 수 있습니다.**
⏳ 시간 복잡도: O(log N) (탐색 범위를 절반씩 줄이므로)
📌 이진 탐색 동작 원리
- 배열의 중간 값을 선택
- 찾고자 하는 값과 비교
- 중간 값이 찾는 값보다 크다면 **왼쪽 부분만 탐색**
- 중간 값이 찾는 값보다 작다면 **오른쪽 부분만 탐색**
- 중간 값이 찾는 값과 같다면 탐색 종료
- 위 과정을 반복하여 값을 찾을 때까지 탐색
📌 이진 탐색 구현 방법
1️⃣ 반복문을 이용한 이진 탐색
public class BinarySearch {
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; // 찾은 경우, 해당 인덱스 반환
} else if (arr[mid] < target) {
left = mid + 1; // 오른쪽 탐색
} else {
right = mid - 1; // 왼쪽 탐색
}
}
return -1; // 찾지 못한 경우
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11, 13};
int target = 7;
int result = binarySearch(arr, target);
if (result != -1) {
System.out.println("값을 찾았습니다! 위치: " + result);
} else {
System.out.println("값이 존재하지 않습니다.");
}
}
}
2️⃣ 재귀 호출을 이용한 이진 탐색
public class RecursiveBinarySearch {
public static int binarySearchRecursive(int[] arr, int left, int right, int target) {
if (left > right) return -1; // 종료 조건 (값을 찾지 못한 경우)
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid; // 값을 찾은 경우
else if (arr[mid] < target) return binarySearchRecursive(arr, mid + 1, right, target); // 오른쪽 탐색
else return binarySearchRecursive(arr, left, mid - 1, target); // 왼쪽 탐색
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11, 13};
int target = 7;
int result = binarySearchRecursive(arr, 0, arr.length - 1, target);
if (result != -1) {
System.out.println("값을 찾았습니다! 위치: " + result);
} else {
System.out.println("값이 존재하지 않습니다.");
}
}
}
📌 이진 탐색을 사용할 수 있는 경우
- ✅ 정렬된 배열에서 특정 값을 빠르게 찾고 싶을 때
- ✅ 데이터 양이 많을 때 효율적인 탐색이 필요할 때
- ✅ 이진 탐색 기반 알고리즘 (이진 탐색 트리, 삼분 탐색 등)을 활용할 때
📌 이진 탐색을 사용할 수 없는 경우
- ❌ 데이터가 정렬되지 않은 경우 (정렬이 필요함)
- ❌ 연속된 데이터가 아닌 경우 (링크드 리스트 등에서는 비효율적)
🔍 결론
이진 탐색은 **정렬된 데이터에서 매우 빠르게 값을 찾을 수 있는 알고리즘**으로, 탐색할 데이터가 많을수록 **선형 탐색보다 훨씬 효율적**입니다.
또한, **코딩 테스트 및 면접에서도 자주 등장하는 개념**이므로 꼭 익혀두는 것이 좋습니다! 🚀
📌 다른 알고리즘도 궁금하다면 함께 확인하세요!
'알고리즘 & 문제 해결 패턴 > 기본 알고리즘 & 자료구조' 카테고리의 다른 글
[알고리즘] DFS vs BFS : 차이점 및 언제 사용해야 할까? (0) | 2025.03.24 |
---|---|
[알고리즘 & 문제 해결 패턴] 해시 테이블(Hash Table) 개념과 활용 사례 (1) | 2025.03.19 |
[알고리즘 & 문제 해결 패턴] 탐욕 알고리즘(Greedy) 원리 및 활용 사례 (0) | 2025.03.17 |
[알고리즘 & 문제 해결 패턴] 다이나믹 프로그래밍(DP) 개념과 대표 문제 풀이 (1) | 2025.03.15 |
[알고리즘] DFS(깊이 우선 탐색) 개념 및 구현 (0) | 2025.03.12 |