코딩테스트/BOJ

[백준][이분탐색] 10816. 숫자 카드2

박소민 2025. 9. 4. 00:05
10816. 숫자 카드2
  • 첫 풀이 - fail
    • 일반 이분탐색 구조로 풀었으나
    • 이 코드는 중복되지 않는 값들로만 이루어졌을때만 가능
      • 그 이유: 중복 값 여러개 있을때 [10 10 10 10] 
      • 두번째 10 위치가  mid로 먼저 인식됐을때 앞에 값을 건너뛰어버리기 때문
n=int(input())
nums=list(map(int,input().split()))
m=int(input())
lst=list(map(int,input().split()))

nums.sort()
result=[]
for val in lst:
    cnt=0
    l,r=0,n-1
    while l<=r:
        mid=(l+r)//2

        if nums[mid]<=val:
            if nums[mid]==val:
                cnt+=1
            l=mid+1
        else:
            r=mid-1
    result.append(cnt)

print(*result)

 

 

  • 두번째 풀이
    • 중복된 값이 존재하는 만큼
    • bisect으로 val, val+1 값 위치 찾아서 val의 갯수 세기
from bisect import bisect_left

n=int(input())
nums=list(map(int,input().split()))
m=int(input())
lst=list(map(int,input().split()))

nums.sort()
result=[]
for val in lst:
    cnt=0

    idx1=bisect_left(nums,val)
    idx2=bisect_left(nums,val+1)
    result.append(idx2-idx1)

print(*result)