https://www.acmicpc.net/problem/10816

 

 

참고) 파이썬에서 이 문제를 이분탐색으로 풀면 시간초과가 발생한다.

 

import sys


# 처음으로 key와 같거나 큰 값이 나타나는 위치를 찾는다
def lowerBound(start, end, key):
    while start < end:
        mid = (start + end) // 2
        if nList[mid] <= key:
            end = mid
        elif nList[mid] < key:
            start = mid + 1
    return end


# 처음으로 key보다 큰 값이 나타나는 위치를 찾는다
def upperBound(start, end, key):
    while start < end:
        mid = (start + end) // 2
        if nList[mid] <= key:
            start = mid + 1
        elif key < nList[mid]:
            end = mid
    return end


n = int(sys.stdin.readline())
nList = list(map(int, sys.stdin.readline().split()))  # 상근이 갖고 있는 카드 리스트
m = int(sys.stdin.readline())
mList = list(map(int, sys.stdin.readline().split()))  # 찾아야 할 카드 리스트
nList.sort()

for i in mList:
    ret = upperBound(0, n, i) - lowerBound(0, n, i)
    print(ret, end=' ')

'알고리즘 > 바이너리서치' 카테고리의 다른 글

Upper bound 이진 탐색  (0) 2019.12.12
Lower bound 이진 탐색  (0) 2019.12.11
1920번. 수 찾기  (0) 2019.12.10

+ Recent posts