[Python] BOJ 10816 - 숫자 카드 2 (lower bound, upper bound)

728x90
반응형

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)

 

728x90
반응형
TAGS.

Comments