백준(Python) 풀이/이분 탐색

백준(Python) 10816번 숫자 카드 2 풀이

개발윗미 2022. 5. 16. 15:37

Python으로 구현한 10816번 숫자 카드 2 문제 풀이입니다.

 

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net


from bisect import bisect_left, bisect_right

n = int(input())
data = list(map(int, input().split()))
data.sort()
m = int(input())
target = list(map(int, input().split()))

def search(data, left_value, right_value) :
    right_index = bisect_right(data, right_value)
    left_index = bisect_left(data, left_value)

    return right_index - left_index

for t in target :
    result = search(data, t, t)
    print(result, end=' ')

 

1. 상근이가 가지고 있는 숫자 카드(data)를 오름차순으로 정렬한다.

 

2. 각 target 값을 꺼내 search() 함수에 전달하여 상근이가 몇 개 가지고 있는지를 구하여 출력한다.

 

3. search() 함수의 작업은 아래와 같다.

  - bisect_right() 를 통해 data 리스트에 존재하고 가장 우측에 있는 right_value 값의 인덱스 값을 구하여 right_index에 할당한다.

  - bisect_left() 를 통해 data 리스트에 존재하고 가장 좌측에 있는 left_value 값의 인덱스 값을 구하여 left_index에 할다한다.

  - right_index 값과 left_index 값의 차를 반환한다.