알고리즘 Study/이코테

[07이진탐색] 이진 탐색: 반으로 쪼개면서 탐색하기 (p188~p196)

쿠리유짱 2025. 11. 30. 09:45
반응형

[이진 탐색]

  • 이진 탐색은 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘이다.
  • 데이터가 무작위일 떄는 사용할 수 없지만, 이미 정렬되어 있다면 매우 빠르게 데이터를 찾을 수 있다는 특징.
  • 이진탐색은 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있음.
  • 이진탐색의 위치 변수 3가지:
    1. 시작점, 2. 끝점, 3. 중간점
    → 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 과정

 

[이미 정려로딘 10개의 데이터 중 값이 4인 원소 찾기]

 

  • 전체 데이터 개수는 10개지만, 이진 탐색을 이용해 총 3번의 탐색으로 원소를 찾음
  • 이진탐색은 한번 확인 시마다 개수가 절반씩 줄어들어 시간 복잡도는 O(log N)임

 

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

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

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)

 

[입출력 결과]

 

반응형