문제
처음에는 이분 탐색을 진행하다 mid값과 찾으려는 수가 같다면 mid값 전 후에 같은 숫자들이 있을 것이니 해당 반복의 리스트에서 카운팅을 하는 방법으로 코드를 작성했다.
허나 이 방식으로는 시간 초과가 떳고 다시 생각해보니 최악의 경우(첫 반복에서 mid값과 찾으려는 수가 동일한 경우) 전체 리스트를 카운팅하게 된다.
import sys
input = sys.stdin.readline
def bin_search(m, nums):
if len(nums) <= 2:
return nums.count(m)
mid = len(nums) // 2
if m == nums[mid]:
return nums.count(m)
elif m < nums[mid]:
return bin_search(m, nums[:mid])
else:
return bin_search(m, nums[mid+1:])
n = int(input())
n_list = sorted(list(map(int, input().split())))
m = int(input())
m_list = list(map(int, input().split()))
answer = []
for x in m_list:
answer.append(bin_search(x, n_list))
print(' '.join(str(x) for x in answer))
위 방법으로 시간 초과가 떠 해쉬 알고리즘을 이용하여 문제를 풀었다.
(파이썬에서 해쉬 알고리즘을 구현할 때 딕셔너리를 많이 사용하는 듯 하다.)
import sys
input = sys.stdin.readline
n = int(input())
n_list = sorted(list(map(int, input().split())))
m = int(input())
m_list = list(map(int, input().split()))
hashtable = {}
for x in n_list:
if x in hashtable:
hashtable[x] +=1
else:
hashtable[x] = 1
print(' '.join(str(hashtable[x]) if x in hashtable else '0' for x in m_list))