문제 정의
- 여러 개의 수가 정렬된 순서로 있을 때 특정한 수를 찾는 방법
- 단순 반복문을 이용하면 수의 개수에 따라 비교 횟수가 증가하는 O(n)의 수행이 이루어짐
- 수가 정렬된 상태에서는 이진 탐색(binary search)을 활용하면 매번 비교되는 요소의 수가 절반으로 감소될 수 있으므로 O(logN)의 수행으로 원하는 수를 찾을 수 있음
- 수의 예 : [12, 25, 31, 48, 54, 66, 70, 83, 95, 108]
- 83의 위치를 찾아보세요
- 88의 위치를 찾아보세요
해결 방법
- 수가 정렬된 상태이므로 중간의 값을 하나 선택한다. 찾으려는 값이 그보다 크면 범위를 오른쪽으로 그보다 작으면 범위를 왼쪽으로 좁힐수 있다.
- 한번 비교 할때 마다 1/2씩 범위가 좁혀진다.
프로그래밍
public class BinarySearchProblem {
public static void main(String[] args) {
int[] numbers = {12, 25, 31, 48, 54, 66, 70, 83, 95, 108};
int target = 83;
int left = 0;
int right = numbers.length-1;
int mid = (left + right)/2;
int temp = numbers[mid];
boolean find = false;
while(left <= right) {
if(target == temp) { //수를 찾은 경우
find = true;
break;
}
else if(target < temp) { // 찾으려는 수가 더 작은 경우
right = mid-1;
}
else {
left = mid+1;
}
mid = (left + right)/2;
temp = numbers[mid];
}
if(find == true)
{
mid++;
System.out.println("찾는 수는 " + mid + "번째 있습니다.");
}
else System.out.println("찾는 수가 없습니다.");
}
}
'알고리즘' 카테고리의 다른 글
다익스트라(Dijlstra) 알고리즘 (0) | 2021.12.04 |
---|---|
최단거리 구하기 문제 (0) | 2021.12.04 |
DFS(Depth - First Search)와 BFS(Breadth - First Search)그래프 탐색 (0) | 2021.11.29 |
정렬 알고리즘 (0) | 2021.11.27 |
나열된 수에서 최솟값과 최댓값 구하기 (0) | 2021.11.21 |
댓글