티스토리 뷰

알고리즘

24. 이분검색

홍복치 2020. 12. 16. 20:41

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

8 32

23 87 65 12 57 32 99 81

 

출력예제 1 

3

 

풀이 

 

lt   mid   rt
    else if(a[mid]<key) lt = mid+1  
  rt=mid-1 else    

 

- 전체 루프는 lt<=rt (범위가 줄어들수록 lt-rt사이 간격이 좁아지며 결국 같이 만남)

- lt와 rt를 기준으로 가운데 값을 mid

- mid 와 key 값이 일치하면 그대로 return

- key값이 mid보다 작으면 rt를 mid-1

- key값이 mid보다 크면 lt를 mid+1

- 이분탐색은 벡터 배열의 처음과 끝을 지정하여 범위를 좁혀가며 탐색, 데이터를 정렬한 후에 탐색함

 

 


#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

// 24. 이분탐색
int main() {
    int n = 0, key, i, lt=0, mid, rt ;
    //배열 크기 및 탐색할 값 입력
    scanf("%d %d", &n, &key);
  
    vector<int> a(n);

    // vector 정렬
    for(i=0; i<n; i++){
        scanf("%d", &a[i]);
        //a.push_back()도 가능
    }
    sort(a.begin(), a.end());
    rt=n-1;
    
    while(lt<=rt){
        mid=(lt+rt)/2;
        if(a[mid]==key){
            printf("%d\n", mid+1);
            return 0;
        }
        else if(a[mid]>key) rt=mid-1;
        else lt=mid+1;
    }
    return 0;
}
 

'알고리즘' 카테고리의 다른 글

44. 마구간 정하기  (0) 2020.12.18
43. 뮤직비디오  (0) 2020.12.17
19. 분노유발자  (0) 2020.04.17
18. 층간소음  (0) 2020.04.17
13. 가장 많이 사용된 자릿수  (0) 2020.04.03
최근에 올라온 글
Total
Today
Yesterday