이진탐색은 원하는 수를 배열에서 탐색하고자 할 때, O(logN)으로 효율적인 탐색을 할 수 있게 해주는 알고리즘이다.
이진탐색은 배열의 처음과 끝을 직접 수정해나가며 원하는 값을 찾는 과정을 거친다.
이진탐색의 기본적인 과정
- 배열을 오름차순으로 정렬한다.
- 탐색할 배열의 처음과 끝을 의미하는 변수를 설정한다.(left, right)
- left와 right의 가운데 값(mid) 과 탐색하는 값을 비교한다.
- 크다면 -> left를 mid + 1로 수정한다.(mid보다 작은 쪽에는 원하는 값이 없는게 확실하니까)
- 작다면 -> right를 mid - 1로 수정한다.(mid보다 큰 쪽에는 원하는 값이 없는게 확실하니까)
- 만약 mid값과 탐색중인 값이 동일하면 index를 출력하고 종료한다(탐색 성공)
- 위 과정을 while문을 통해 반복하다가, left 가 right보다 커졌다면 탐색중인 값은 배열에 존재하지 않는다는 의미이므로 탐색 실패를 출력한다.
이진탐색을 활용한 문제의 코드이다.
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
//int[] arr= new int[100000];
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for(int i = 0;i<n;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
//배열 정렬
Arrays.sort(arr);
for(int i = 0;i<m;i++){
int a = Integer.parseInt(br.readLine());
int left = 0; //left 초기값은 0
int right = n-1;//right 초기값은 배열의 제일 끝
int mid = 0;
while(left <= right){
mid = (left + right) /2; //left와 right의 가운데 값
if(arr[mid] == a) { //탐색성공
sb.append((mid+1) + "\n");
//System.out.println(mid);
break;
}
else{
if(arr[mid] < a){ // 탐색하는 값이 mid값보다 크면
left = mid + 1;
}
else{//탐색하는 값이 mid값보다 작으면
right = mid -1;
}
}
}
if(left > right){ //left가 right보다 크면 탐색 실패
sb.append(-1 + "\n");
}
}
System.out.println(sb);
}
}
출처 : 코드트리
https://www.codetree.ai/missions/8/problems/find-number-fast/description
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
'알고리즘 > 알고리즘 개념' 카테고리의 다른 글
[알고리즘 개념] 그리디 알고리즘(Greedy Algorithm) (0) | 2023.09.11 |
---|---|
[알고리즘 개념] Map, Set, Queue (1) | 2023.09.06 |
[알고리즘 개념] iterator (0) | 2023.09.05 |
[알고리즘 개념] Shorten time technique (0) | 2023.08.23 |