배열 등 자료를 두 부분으로 쪼개어 탐색하는 방법
특정 값 또는 자료가 존재하는지를 탐색할 때 사용함
이분 탐색을 위한 배열은 정렬되어 있어야 함
- 로직
1) 탐색 배열의 내 중간 인덱스( (시작 인덱스 + 끝 인덱스) / 2 )를 구함
2) 배열[중간 인덱스]에 위치한 값과 찾으려는 값 비교
3) 비교 결과를 통해 반복 여부 결정
3-1) 배열 값과 같으면 중간 인덱스 반환
3-2) 배열 값이 작으면 "중간 인덱스 + 1"를 시작 인덱스로 지정
3-3) 배열 값이 크면 "중간 인덱스 - 1"를 끝 인덱스로 지정
4) 인덱스 범위가 하나가 될 때까지 1) 2) 3)을 반복
-> 만약 인덱스 범위가 1인데 값이 다르다면 해당 값은 존재하지 않는 값
public class 이분탐색_기본 {
public static void main(String[] args) throws Exception {
int[] arr = {9, 1, 3, 5, 7, 8};
Arrays.sort(arr); // 정렬
int search = 8;
int answer = 0; // 베열 내 있으면 1 없으면 0 반환
int start = 0; // 배열의 시작 위치
int end = arr.length - 1; // 배열의 끝 위치
System.out.print("탐색 순서 : ");
while (start <= end) {
int mid = (start + end) / 2; // 배열의 중간 위치
System.out.print(mid + " ");
// 찾으려는 값보다 배열에 들어가 있는 값이 더 작다면
if (search > arr[mid]) {
start = mid + 1; // 현재 중간 값보다 오른쪽에 있다는 뜻
}
// 찾으려는 값보다 배열에 들어가 있는 값이 더 크다면
if (search < arr[mid]) {
end = mid - 1; // 현재 중간 값보다 왼쪽에 있다는 뜻
}
// 찾으려는 값과 배열에 들어간 값이 같다면
if (search == arr[mid]) {
end = arr[mid];
answer = 1;
break;
}
}
System.out.println();
System.out.println(answer); // 1
}
}
백준 1920 수 찾기 (기본 문제)
https://angelplayer.tistory.com/432
[알고리즘] 이항 계수, 파스칼의 삼각형 (0) | 2023.04.07 |
---|---|
[알고리즘] 최소 신장 트리 (크루스칼, 프림 알고리즘) (0) | 2023.03.01 |
[알고리즘] 서로소 집합 (0) | 2023.02.28 |
[알고리즘] DFS (0) | 2023.02.24 |
[알고리즘] BFS (너비 우선 탐색) (0) | 2023.02.15 |