페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#8069

Tutorial: 이진탐색(라이브러리 사용법) 1초 1024MB

문제

이전 이진탐색 문제에서는 정렬된 데이터에서 특정 값을 찾는 알고리즘을 구현하였다.

이번 문제에서는 이진탐색을 직접 구현하지 않고, 이미 만들어진 함수 사용법을 익히는것이 목표이다.

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 출력

[문제]

N개의 정렬된 데이터가 주어지고 Q개의 질의값이 주어진다.

Q개의 질의값에 대해 가장 가까운 데이터 값을 출력하시오.


입력

첫 줄에 정렬된 데이터의 수 N과 질의의 수 Q가 공백을 구분으로 주어진다.

다음 줄에 N개의 정렬된 데이터 a_i가 공백을 구분으로 주어진다.

다음 Q줄에 걸쳐 질의값 b_i가 주어진다.

1 \le N \le 500\,000

1 \le Q \le 500 \, 000

1 \le a_i \le 10^9

1 \le b_i \le 10^9


출력

Q줄에 걸쳐 각 질의값과 가장 가까운 데이터 값을 출력한다.

만약 가장 가까운 수가 2개면 작은 수를 출력한다.


예제1

입력
93
149111111202045
3
40
13
출력
4
45
11


출처

@eva

역링크