Baekjoon/이분탐색

[백준] 10816 숫자 카드 2 (실버4) / 이분탐색

hellosonic 2023. 5. 29. 19:00

문제요약

나의 코드 및 설명

n = int(input())
s = list(map(int, input().split()))
s.sort()
d = {} #개수 담을 딕셔너리 생성
for i in range(len(s)):
    if s[i] not in d: #만약 딕셔너리에 없다면
        d[s[i]] = 1 #해당 값에 카운트 1
    else: #만약 이미 딕셔너리에 있다면
        d[s[i]] += 1 #해당 값에 카운트 += 1

m = int(input())
num_list = list(map(int, input().split()))

result = []

#이분탐색 시작
for x in num_list: #두 번째 숫자리스트에 있는 값을 하니씩 확인
    start = 0 #시작 인덱스 : 0
    end = n-1 #끝 인덱스 : n-1
    ans = False #ans에 False 저장(이분탐색이 끝난 후에도 False가 저장되어 있다면 result에 0 저장)
    while start <= end:
        mid = (start + end) // 2
        if x < s[mid]:
            end = mid-1
        elif x > s[mid]:
            start = mid+1
        else: #만약 첫 번재 숫자리스트에 숫자가 있다면, 
            ans = True #ans를 True로 갱신
            break
    if ans: #ans가 갱신된다면,
        result.append(d[s[mid]]) #목표값에 해당하는 딕셔너리 추가 
    else:
        result.append(0)

print(" ".join(map(str, result)))

피드백

딕셔너리를 활용하여 첫 번째 리스트의 숫자가 각각 몇 번씩 등장하는지 저장하고, 이분탐색을 통해 숫자가 첫 번째 리스트에 있는 숫자라면 해당 숫자를 키로 갖는 딕셔너리 값을 불러와서 저장하는 방법으로 문제를 해결하였다. 시간복잡도를 줄이기 위해 딕셔너리, 이분탐색 알고리즘을 활용했는데, 꽤 유익한 문제인 것 같다.