[이코테] 이진 탐색

이경준·2021년 8월 14일
0

알고리즘

목록 보기
14/17

밑의 글은 이론적이고 복잡한 내용이고, 이건 바로 코테에 적용하기 좋은 코드

코드

from bisect import bisect_left, bisect_right

arr = [1,2,4,4,8]
x = 4

# 해당 값 왼쪽 인덱스 반환
bisect_left(arr, x)

# 해당 값 오른쪽 인덱스 반환
bisect_right(arr, x)

# 두 수 사이의 개수 구하는 함수
def count_by_range(array, left, right):
	left_index = bisect_left(array, left)
    right_index = bisect_right(array, right)
    return right_index - left_index

순차 탐색

  • 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법
  • 코드 : for문 돌리기

이진 탐색

  • 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 탐색
  • 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘
  • start, end는 index 숫자이다.

반복문으로 구현한 코드 (재귀보다는 반복문이 편함)

def bs(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 = list(map(int, input().split()))

array = list(map(int, input().split()))

result = bs(array, target, 0, n-1)
if result == None:
    print("원소 없음")
else:
    print(result + 1)

재귀 함수로 구현한 코드

def bs(array, target, start, end):
    if start > end:
        return None
    
    mid = (start + end) // 2
    
    if array[mid] == target:
        return mid
    elif array[mid] > target:
        return bs(array, target, start, mid-1)
    else:
        return bs(array, target, mid+1, end)

n, target = list(map(int, input().split()))

array = list(map(int, input().split()))

result = bs(array, target, 0, n-1)
if result == None:
    print("원소 없음")
else:
    print(result + 1)
profile
The Show Must Go On

0개의 댓글