CS/알고리즘

[Algorithm] 이분 탐색(Binary Search)

Ella_K 2023. 3. 12. 14:28

이분 탐색

탐색 범위를 두 부분으로 분할 하면서 검색하는 방식

알고리즘

  1. 오름차순 정렬
  2. 배열 포인터 인덱스 start, end, mid 값 설정
  3. mid와 내가 구하고자 하는 값과 비교
  4. 같으면 mid가 답
  5. 구할 값이 mid 보다 작으면 start = mid + 1
  6. 작으면 end = mid - 1
  7. start > end가 될 때까지 반복
public class binarySearch {
    public int solution(int n, int m, int[] arr){
        Arrays.sort(arr);
        int start = 0;
        int end = n -1;
        int mid = 0;
        while(start <= end){
            mid = (start + end) / 2;
            if(arr[mid] == m) return mid+1;
            else if (arr[mid] < m) start = mid + 1;
            else end = mid - 1;
        }
        return -1;
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // n개의 숫자 입력
        int m = sc.nextInt(); // m이 n개의 숫자 중 몇번째에 있는지 탐색
        int[] arr = new int[n];
        for(int i = 0; i < n; i++){
            arr[i] = sc.nextInt();
        }
        System.out.print(new binarySearch().solution(n, m, arr)); // m의 위치 출력. 없으면 -1 출력
    }
}

시간 복잡도

전체 탐색: O(N)
이분 탐색: O(logN)