[Python] BOJ 10816 - 숫자 카드 2 (lower bound, upper bound)
https://www.acmicpc.net/problem/10816
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,00
www.acmicpc.net
주어진 배열에 대해 입력받은 숫자의 갯수를 세야 하는 문제이다.
단순한 이분 탐색으로는 그 숫자의 위치는 찾을 수 있을지 몰라도 숫자의 갯수는 찾지 못한다.
검색을 하던도중 lower bound와 upper bound 개념을 발견했다.
* Lower bound는 찾고자 하는 숫자 이상의 값이 처음으로 나오는 인덱스 값을 반환하고
Upper bound는 찾고자 하는 숫자 초과의 값이 처음으로 나오는 인덱스 값을 반환한다.
따라서 배열에서 찾고자하는 수의 upper_bound에서 lower_bound를 빼주면 찾고자하는 수의 갯수가 나오게 된다.
* 이분탐색에서 배열은 항상 정렬된 상태여야 한다.
n,L,k,M = int(input()),list(map(int, input().split())),int(input()),list(map(int, input().split())) d = [] L.sort() def upper_bound(s, e, d): while(e - s > 0): m = (s+e)//2 if(L[m] <= d): s = m+1 else: e = m return e+1 def lower_bound(s, e, d): while(e - s > 0): m = (s+e)//2 if(L[m] < d): s = m+1 else: e = m return e+1 for i in M: d.append(upper_bound(0, n, i) - lower_bound(0, n, i)) print(*d)