문제
이전 이진탐색 문제에서는 정렬된 데이터에서 특정 값을 찾는 알고리즘을 구현하였다.
이번 문제에서는 이진탐색을 직접 구현하지 않고, 이미 만들어진 함수 사용법을 익히는것이 목표이다.
C++에서는 이진탐색과 관련된 함수들로 binary_search, lower_bound, upper_bound라는 함수를 제공하나,
lower_bound만 알아도 이진탐색 문제 풀기에는 충분하다.
lower_bound 는 정렬된 데이터에서 찾을 값 이상이 들어있는 최초의 지점을 구해준다.
lower_bound 사용법은 sort 함수와 유사하다.
std::lower_bound(배열의 시작 위치, 배열의 끝 위치의 다음 위치, 찾을 값)
반환값은 인덱스(상대적 위치)가 아니라 이터레이터(주소값, 절대적 위치)가 반환된다. 따라서 반환값에 시작 주소값을 빼주면 인덱스를 구할 수 있다. (찾지 못했으면 배열의 끝 위치의 다음 위치 반환)
아래 코드는 정렬된 데이터에서 target을 찾아 인덱스를 구하는 코드이다.
[C++]
#include <stdio.h>
#include <algorithm>
int main(){
int A[9] = {1,4,9,11,11,11,20,20,45};
int target = 11;
int idx = std::lower_bound(A+0, A+9, target) - A;
printf("%d", idx); // 3 출력
return 0;
}
Python의 경우 C++의 lower_bound와 같은 기능을 사용하고 싶으면 bisect 라이브러리를 불러오면 된다.
bisect.bisect_left로 사용하며, 사용법은 아래 내용을 참고한다.
[Python]
import bisect
A = [1,4,9,11,11,11,20,20,45]
target = 11
idx = bisect.bisect_left(A,target)
print(idx) # 3 출력
[문제]
각
입력
첫 줄에 정렬된 데이터의 수
다음 줄에
다음
출력
만약 가장 가까운 수가 2개면 작은 수를 출력한다.
예제1
93
1 4 9 11 11 11 20 20 45
3
40
13
4
45
11