티스토리 뷰

이진 탐색 알고리즘

  • 순차 탐색: 특정한 데이터를 찾기 위해 앞에서부터 하나씩 확인하는 방법
  • 이진 탐색: 정렬된 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
                    (시작점, 끝점, 중간점을 이용하여 탐색 범위 설정)

이진 탐색 소스코드: 재귀적 구현

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) # 몇 번째 원소인지 출력하려고 +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

bisect_left(a, x): 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 왼쪽 인덱스 반환

bisect_right(a, x): 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 오른쪽 인덱스 반환

 

파라메트릭 서치

최적화 문제를 결정문제(예/아니오)로 바꾸어 해결하는 기법으로 특정한 조건을 만족하는 값을 빠르게 찾는 문제가 그 예시이다.

-> 이진탐색으로 해결 가능

'Python > 이코테' 카테고리의 다른 글

8-1. 다이나믹 프로그래밍  (0) 2022.07.13
8-2. 1로 만들기  (0) 2022.07.10
7-3. 떡볶이 떡 만들기  (0) 2022.07.08
7-2. 부품찾기  (0) 2022.07.07
6-1. 기준에 따라 데이터를 정렬  (0) 2022.07.03
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday