백준 알고리즘/이진탐색

[백준 알고리즘] 10816번 숫자 카드 2 - Python

개발로 먹고 살자 2022. 3. 10. 10:43

10816번은 주어진 값과 비교하여 가지고 있는 숫자 카드의 개수를

출력해야 하는 문제이다.

 

처음에 이진 탐색을 통해 풀었는데 시간 초과로 실패하였다.

from sys import stdin
from collections import Counter

n = stdin.readline()
n_list = sorted(map(int, stdin.readline().split()))
m = stdin.readline()
m_list = list(map(int, stdin.readline().split()))

def binary(target, n_list):
    start, end = 0, len(n_list) - 1

    while(start <= end):
        mid = (start + end) // 2
        
        if target < n_list[mid]:
            end = mid - 1
        elif target > n_list[mid]:
            start = mid + 1
        else:
            return Counter(n_list).get(target)
    return 0

if __name__ == "__main__":

    for i in range(len(m_list)):
        print(binary(m_list[i], n_list),end=' ')

 

 

그래서 파이썬의 내장 함수인 Counter를 사용하여 값을 출력했다.

Counter는 딕셔너리 형태로 저장이 되기 때문에 빠르게 값을 찾을 수 있다.

from sys import stdin
from collections import Counter

n = stdin.readline()
n_list = sorted(map(int, stdin.readline().split()))
m = stdin.readline()
m_list = list(map(int, stdin.readline().split()))

count = Counter(n_list)


if __name__ == "__main__":

    for i in range(len(m_list)):
        if(m_list[i] in count):
            print(count[m_list[i]], end=' ')
        else:
            print(0, end='')