이 자료는 이코테 2021 강의 몰아보기에서 참고하여 작성했습니다.
# 정렬되어 있는 리스트에 한해서 사용 가능.
def binary_search(array, target, start, end):
if start > end:
return None
mid = (start + end)//2
if array[mid] == target:
return mid
elif array[mid] > target:
return binary_search(array, target, start, mid-1)
else:
return binary_search(array, target, mid +1, end)
# n(원소의 개수)가 target(찾고자 하는 값)을 입력받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int,input().split()))
# 이진 탐색 수행결과 출력
result = binary_search(array, target, 0,n-1)
if result == None:
print("원소가 존재하지 않습니다.")
else:
print(result+1)
# 정렬되어 있는 리스트에 한해서 사용 가능.
def binary_search(array, target, start, end):
while start <= end:
mid = (start+end) //2
if array[mid] == target:
return mid
elif array[mid] > target:
end = mid-1
else:
start= mid +1
return None
# n(원소의 개수)가 target(찾고자 하는 값)을 입력받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int,input().split()))
# 이진 탐색 수행결과 출력
result = binary_search(array, target, 0,n-1)
if result == None:
print("원소가 존재하지 않습니다.")
else:
print(result+1)
from bisect import bisect_left, bisect_right
a = [1,2,4,4,8]
x = 4
print(bisect_left(a,x))
print(bisect_right(a,x))
실행결과
2
4
from bisect import bisect_left, bisect_right
# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
def count_by_range(a, left_value, right_value):
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index-left_index
# 배열 선언
a = [1,2,3,3,3,3,4,4,8,9]
# 값이 4인 데이터 개수 출력
print(count_by_range(a,4,4))
# 값이 [-1,3] 범위에 있는 데이터 개수 출력
print(count_by_range(a,-1,3))
실행결과
2
6

# 떡의 개수(N)와 요청한 떡의 길이(M)을 입력
n, m = list(map(int,input().split(' ')))
array = list(map(int,input().split()))
# 이진 탐색을 위한 시작점과 끝점 설정
start = 0
end = max(array)
# 이진 탐색 수행 (반복적)
result = 0
while (start <= end):
total = 0
mid = (start+end)//2
for x in array:
# 잘렸을 때의 떡의 양 계산
if x > mid:
total += x - mid
# 떡의 양이 부족한 경우 더 많이 자르기 때문에(왼쪽 부분 탐색)
if total < m:
end = mid - 1
# 떡의 양이 충분한 경우 덜 자르기 때문에(오른쪽 부분 탐색)
else:
result = mid # 최대한 덜 잘랐을 때가 답이므로, 여기에서 result 기록
start = mid + 1
# 정답 출력
print(result)

from bisect import bisect_left, bisect_right
def count_bisect(array, left_num, right_num):
right_index = bisect_right(array, right_num)
left_index = bisect_left(array, left_num)
result = right_index - left_index
return result if result else -1
n,x = map(int,input().split())
map =list(map(int,input().split()))
result = count_bisect(map, x,x)
print(result)