본문 바로가기

두두의 알고리즘/문제

[이분탐색] 난이도2, Zoho 인터뷰 '정렬된 배열에서 특정 수의 개수 구하기' (Python)

728x90

<문제>

N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 예를 들어 수열 {1,1,2,2,2,2,3}이 있을 때 x=2라면, 현재 수열에서 값이 2인 원소가 4개이므로 4를 출력합니다.

단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.

 

<입력 조건>

  • 첫째 줄에 N과 x가 정수 형태로 공백으로 구분되어 입력됩니다. (1 <=N <=1,000,000), (-10e9 <= x <=10e9)
  • 둘째 줄에 N개의 원소가 정수 형태로 공백으로 구분되어 입력됩니다. (-10e9 <=각 원소의 값 <=10e9)

<출력 조건>

  • 수열의 원소 중에서 값이 x인 원소의 개수를 출력합니다. 단, 값이 x인 원소가 하나도 없다면 -1을 출력합니다.

<문제 풀이>

  1. x의 값이 배열에 들어가는 인덱스를 반환해주는 파이썬 라이브러리 bisect 사용
  2. 왼쪽 인덱스는 x가 처음 나오는 위치고, 오른쪽 인덱스는 x의 마지막 위치이므로 오른쪽 인덱스와 왼쪽 인덱스의 차를 구함

<코드>

#220329
'''입력 예시
7 2
1 1 2 2 2 2 3

7 4
1 1 2 2 2 2 3
'''

from bisect import bisect_left, bisect_right
n,x = map(int, input().split())
num = list(map(int,input().split()))

left = bisect_left(num,x)
right = bisect_right(num,x)

result = right-left

if result==0:
    print(-1)
else:
    print(result)