정리 내용

이진 탐색이란

  • binary search (반으로 쪼개면서 탐색하기)
  • 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있다.
  • 데이터가 무작위일때는 사용할 수 없다.
  • 탐색 범위를 절반씩 좁히면서 데이터를 탐색하는 특징이 있다.
  • 이진 탐색은 변수 3개를 사용하여 구현하는데 변수는 시작점, 끝점, 중간점을 사용한다.
  • 찾으려는 데이터와 중간점(middle) 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는다.
  • 시작점과 끝점, 중간점을 정할 때 중간점이 실수일 때는 소수점 이하를 버린다.
  • 시간 복잡도가 O(logN)이다.
  • 절반씩 데이터를 줄어들도록 만든다는 점에서 퀵 정렬과 공통점이 있다.
  • 이진 탐색을 구현하는 방법은 2가지가 있다.
    1) 재귀 함수를 이용한 구현
    2) 반복문을 이용한 구현
  • 코딩 테스트에서 이진 탐색 문제는 탐색 범위가 큰 상황에서 탐색을 가정하는 문제가 많다
  • 탐색(data) 범위가 2000만을 넘어가면 이진 탐색으로 접근해보자

재귀 함수로 구현한 이진 탐색 소스코드

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)

출처 & 깃허브

이것이 취업을 위한 코딩 테스트다 with python

github

0개의 댓글

관련 채용 정보