파이썬 함수 bisect_right
, bisect_left
를 사용하면 쉽게 풀린다.
search_left
함수는 정렬된 리스트에서 num이 여러개 존재할 경우 가장 앞에 위치한 num의 index를 반환한다.
search_right
함수는 정렬된 리스트에서 num이 여러개 있을 경우 가장 뒤에 위치한 num의 index에 1을 더한 값을 반환한다.
# pypy3 : 1584ms, python3 : 시간초과
import sys
input = sys.stdin.readline
print = sys.stdout.write
def search_left(num):
lo = 0
hi = n
while lo < hi:
mid = (lo + hi) // 2
temp = data[mid]
if temp < num:
lo = mid + 1
elif temp >= num:
hi = mid
return lo
def search_right(num):
lo = 0
hi = n
while lo < hi:
mid = (lo + hi) // 2
temp = data[mid]
if temp > num:
hi = mid
else:
lo = mid + 1
return lo
n = int(input())
data = list(map(int, input().split()))
data.sort()
m = int(input())
target = list(map(int, input().split()))
for t in target:
print(str(search_right(t) - search_left(t)) + " ")
# python3 : 1536ms
from collections import defaultdict
import sys
input = sys.stdin.readline
print = sys.stdout.write
n = int(input())
data = list(map(int, input().split()))
data.sort()
m = int(input())
target = list(map(int, input().split()))
hashmap = defaultdict(int)
for d in data:
hashmap[d] += 1
for t in target:
print(str(hashmap[t]) + " ")