-
[이코테] chap7. 이진 탐색Algorithm PS👩🏻💻/개념 2023. 5. 3. 14:45
이진 탐색
탐색의 범위를 반으로 줄여나가면서 데이터를 빠르게 탐색하는 기법.
특징
- 이진 탐색은 배열 내부의 데이터가 정렬되어 있을 때만 사용
- 데이터의 개수가 1000만개를 넘어가거나 탐색 범위의 크기가 2000만-1000억 이면 이진 탐색으로 접근하길 권한다.
- 3가지 변수(시작점, 끝점, 중간점)가 사용된다.
- 시작점, 끝점 : 탐색하고자 하는 범위를 나타내기 위해 사용
- 중간점 : 중간점에 있는 데이터와 찾고자 하는 데이터가 일치하는지 비교기위해 사용.
- 시간 복잡도: O(logN) -> 한 번 비교때마다 반 씩 줄어드니까!
소스코드 (재귀, 반복문)
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)
'Algorithm PS👩🏻💻 > 개념' 카테고리의 다른 글
[이코테] chap9. 최단 경로 (1) 2023.05.08 [이코테] chap8. 다이나믹 프로그래밍 (0) 2023.05.07 [이코테] chap6. 정렬 (0) 2023.04.23 [이코테] chap5-3. 음료수 얼려먹기 (0) 2023.04.23 [이코테] chap5. DFS/BFS (0) 2023.04.22