순차 탐색 소스코드
def sequential_search(n, target, array):
# 각 원소를 하나씩 확인하며
for i in range(n):
# 현재의 원소가 찾고자 하는 원소와 동일한 경우
if array[i] == target:
return i+1 # 현재의 위치 반환 (인덱스 +1)
print("생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요.")
input_data = input().split()
n = int(input_data[0]) # 원소의 개수
target = input_data[1] # 찾고자 하는 문자열
print("앞서 적은 원소 개수만큼 문자열을 입력하세요. 구분은 띄워쓰기 한 칸으로 합니다.")
array = input().split()
print(sequential_search(n, target, array))
[step 1] 중간점 정해서 비교하기
시작점과 끝점을 확인한 다음 둘 사이에 중간점을 정한다. 중간점이 실수면 소수점 이하를 버린다.

위의 예시에서 시작점의 인덱스는 [0], 끝점은 [9], 중간점은 [4]이다.
다음으로 중간점 [4]의 데이터 8과 찾으려는 데이터 4를 비교한다.
중간점의 데이터 8이 더 크므로 중간점 이후(오른쪽)의 값은 확인할 필요가 없다. 끝점을 인덱스 [4]의 이전인 [3]으로 옮긴다.
[step 2]

시작점은 [0], 끝점은 [3], 중간점은 [1]이다.
중간점에 위치한 데이터 2는 찾으려는 데이터 4보다 작으므로 이번에는 값이 2 이하(왼쪽)인 데이터는 더 이상 확인할 필요 가 없다.
따라서 시작점의 인덱스를 [2]로 변경한다.
[step 3]

시작점은 [2], 끝점은 [3], 중간점은 [2]이다.
중간점의 데이터 4는 찾으려는 데이터 4와 동일하므로 이 시점에서 탐색을 종료한다.
전체 데이터의 개수는 10개지만, 이진 탐색을 이용해 총 3번의 탐색으로 원소를 찾을 수 있었다.
이진 탐색은 한 번 확인할 때마다 확인하는 원소의 개수가 절반씩 줄어든다는 점에서 시간 복잡도가 O(logN)이다.
절반씩 데이터를 줄어들도록 만든다는 점에 있어 퀵 정렬과 공통점이 있다. 이진 탐색을 구현하는 방법에는 2가지가 있다.
이진 탐색 코드1 - 재귀 함수 이용
# 이진 탐색 소스코드 구현 (재귀 함수)
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)
이진 탐색 코드2 - 반복문 이용
# 이진 탐색 소스코드 구현 (반복문)
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)