이진 탐색과 다양한 활용 사례

704. 이진 탐색 기본

정렬된 배열에서 특정 값을 찾을 때 이진 탐색을 사용할 수 있습니다. 중앙값을 기준으로 탐색 범위를 절반씩 줄여나가는 방식입니다.


class BinarySearch:
    def find_index(self, nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return -1

35. 삽입 위치 찾기

값이 존재하지 않을 때 삽입 위치를 반환하는 문제입니다. 탐색 종료 후 left 변수가 삽입 지점을 가리킵니다.


class InsertPosition:
    def find_insert_index(self, nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left

34. 시작 및 종료 위치 찾기

정렬된 배열에서 특정 값의 첫 번째와 마지막 위치를 찾는 문제입니다. 두 번의 이진 탐색을 통해 각각의 경계를 찾을 수 있습니다.


class RangeFinder:
    def find_boundaries(self, nums, target):
        def find_left():
            left, right = 0, len(nums) - 1
            result = -1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] == target:
                    right = mid - 1
                    result = mid
                elif nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
            return result

        def find_right():
            left, right = 0, len(nums) - 1
            result = -1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] == target:
                    left = mid + 1
                    result = mid
                elif nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
            return result

        return [find_left(), find_right()]

69. 제곱근 계산

주어진 정수의 제곱근을 정수 형태로 반환하는 문제입니다. 이진 탐색을 통해 효율적으로 계산할 수 있습니다.


class SquareRoot:
    def calculate(self, x):
        left, right = 0, x
        while left <= right:
            mid = left + (right - left) // 2
            square = mid * mid
            if square == x:
                return mid
            elif square < x:
                left = mid + 1
            else:
                right = mid - 1
        return right

367. 완전 제곱수 확인

주어진 수가 완전 제곱수인지 판단하는 문제입니다. 이진 탐색으로 제곱값을 비교해 나가며 판단합니다.


class PerfectSquareChecker:
    def is_perfect_square(self, num):
        left, right = 0, num
        while left <= right:
            mid = left + (right - left) // 2
            square = mid * mid
            if square == num:
                return True
            elif square < num:
                left = mid + 1
            else:
                right = mid - 1
        return False

요약 및 정리

이진 탐색은 정렬된 배열에서 특정 값을 찾거나 경계값을 결정하는 데 매우 유용합니다. 탐색 범위의 갱신 방식, 반복 조건, 종료 후 상태를 정확히 이해하면 다양한 변형 문제를 해결할 수 있습니다.

태그: python 알고리즘 이진 탐색 배열 처리

9월 27일 20:41에 게시됨