[백준] 숫자 카드 2

hyyyynjn·2021년 8월 23일
0

Problem Solving

목록 보기
2/13
post-thumbnail

숫자 카드 2

접근 방식

파이썬 함수 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]) + " ")

0개의 댓글