이진 탐색이란?

vinson·2022년 3월 21일
0

Algorithm 순한맛

목록 보기
2/4
post-thumbnail

이진 탐색(Binary Search) ?

  • 🍔 순차 탐색을 먼저 알아야함

순차 탐색 (Sequential Search) ?

  • 앞에서부터 하나씩 차례대로 확인하는 방법
# 순차 탐색 소스코드 구현
def sequential_search(n, target, array):
  # 각 원소를 하나씩 확인하며
  for i in range(n):
    # 현재의 원소가 찾고자 하는 원소와 동일한 경우
    if array[i] == target:
      return i+1 # 현재의 위치 반환(인덱스는 0부터 시작하므로 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))
  • 정렬되어 있어야만 사용 가능.
  • 범위를 반 씩 좁혀가며 빠르게 탐색하는 알고리즘.
  • Target값과 중간점(Minddle) 위치 값을 반복적으로 비교
  • 스무 고개 처럼 👍

이진 탐색 소스코드 구현(재귀 함수)

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)
  • '생각하는 프로그래밍' 저자 존 벤틀리의 말에 따르면
    binary search를 제대로 작성한 프로그래머는 10%내외라 할정도로 실제 구현은 까다롭다.
  • 코테에 자주 나오니 가급적 외우길 권장
  • 처리해야 할 데이터의 개수가 1,000만 이상이면 이진 탐색과 같이 O(logN)의 속도를 내야하는 경우가 많다.
profile
Pay it forward

0개의 댓글