programming language/Algorithm
[이코테] 이진 탐색 문제 - 정렬된 배열에서 특정 수의 개수 구하기
jellylucy
2024. 1. 8. 13:01
문제
N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요.
단, 이 문제의 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.
입력 예시
7 2
1 1 2 2 2 2 3
출력 예시
4
n, x = map(int, input().split())
graph = list(map(int, input().split()))
countA = -1
countB = -1
start = 0
end = len(graph) - 1
# 처음 등장하는 인덱스와 마지막으로 등장하는 인덱스
while(start <= end):
mid = (start + end) // 2
# print(mid)
if ((mid == 0 or x > graph[mid - 1]) and graph[mid] == x): # 찾은 경우
countA = mid
break
elif (graph[mid] >= x):
end = mid - 1
else:
# (graph[mid] <= x):
start = mid + 1
# print(countArr)
start = 0
end = len(graph) - 1
while(start <= end):
mid = (start + end) // 2
# print(mid)
if ((mid == len(graph) - 1 or x < graph[mid + 1]) and graph[mid] == x): # 찾은 경우
countB = mid
break
elif (graph[mid] <= x):
start = mid + 1
else:
# (graph[mid] <= x):
end = mid - 1
# print(countArr)
result = countB - countA + 1
if (countA == -1):
print(-1)
elif (result == 0):
print(-1)
else:
print(result)