데이터의
탐색 범위를 절반씩 좁혀가며데이터를 탐색하는 방법
정렬된 상태여야 함변수 3개 사용동작 과정시간 복잡도O(logN)
→ 한번 탐색할 때마다 탐색 범위가 절반으로 줄어듦
재귀 함수 이용
public static void binarySearch(int start, int end) {
int mid = (start + end) / 2;
// 찾는 원소가 없는 경우
if (start > end) {
System.out.println("원소가 존재하지 않습니다.");
return;
}
// 찾은 경우 결과 출력
if (arr[mid] == target) {
result = mid + 1;
System.out.println(result);
}
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
if (arr[mid] > target) {
binarySearch(start, mid - 1);
}
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
if (arr[mid] < target) {
binarySearch(mid + 1, end);
}
}
반복문 이용
public static void binarySearch(int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
// 찾은 경우 중간점 인덱스 반환
if (arr[mid] == target) {
result = mid + 1;
System.out.println(result);
return;
}
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
else if (arr[mid] > target) {
end = mid - 1;
}
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else {
start = mid + 1;
}
}
System.out.println("원소가 존재하지 않습니다.");
}
문제를 뒤집어서 매개변수를 도입해 정답을 구하는 방식
모든 값에 대해 Yes/No 판단이 가능하고 그 결과가 정렬되어 있어야 함yes | no no no … nono ⇒ 정답 : 700