티스토리 뷰
📌이진 탐색
배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘
배열이 이미 정렬되어 있다면 매우 빠르게 데이터를 찾을 수 있다는 특징
탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징
위치를 나타내는 변수 3개 사용
시작점, 끝점, 중간점
찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교하여 원하는 데이터를 찾음
한번 확인할 때마다 확인하는 원소가 절반씩 줄어든다는 점에서 시간 복잡도 O(logN)
📌재귀 함수로 구현한 이진 탐색
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)
📌참고
'코딩테스트' 카테고리의 다른 글
떡볶이 떡 만들기 (0) | 2024.10.26 |
---|---|
부품 찾기 (0) | 2024.10.25 |
두 배열의 원소 교체 (2) | 2024.10.23 |
성적이 낮은 순서로 학생 출력하기 (2) | 2024.10.22 |
위에서 아래로 (1) | 2024.10.21 |