728x90

문제 181. (2022-02-11)

이코테 기출) 이분탐색. 정렬된 배열에서 특정 수의 개수 구하기

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

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

 


입력

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

 


출력

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

 


입력 예시

7 2
1 1 2 2 2 2 3

 


출력 예시

4

 


❧ 정답

🔎IDEA) 이분탐색 - bisect 모듈을 사용해서 해당 원소가 들어갈 위치를 파악한다.

  • bisect : 시간복잡도가 O(lgN) 인 파이썬 내장 모듈
  • bisect.bisects_left(arr, x) : arr에 원소 x가 들어갈 맨 왼쪽 인덱스를 반환한다.
  • bisect.bisects_right(arr, x) : arr에 원소 x가 들어갈 맨 오른쪽 인덱스를 반환한다.

[Line 6]
👉 정렬된 원소가 입력으로 주어지므로 x원소가 들어갈 맨 오른쪽 인덱스 에서 x원소가 들어갈맨 왼쪽 인덱스 를 빼면 x가 등장하는 횟수를 구할 수 있다.

 

  • Reference
 

bisect — Array bisection algorithm — Python 3.10.2 documentation

bisect — Array bisection algorithm Source code: Lib/bisect.py This module provides support for maintaining a list in sorted order without having to sort the list after each insertion. For long lists of items with expensive comparison operations, this can

docs.python.org

 

728x90