Lower Bound

target 이상의 배열에서 처음 나타나는 인덱스 반환

즉, arr[index] >= target 을 만족하는 가장 작은 index 찾는다.

public static int lowerBound(int[] arr, int target){
	int low = 0;
	int high = arr.length; // high를 배열 길이로 설정하는 것이 핵심
 
    // low와 high가 같아질 때까지 반복
    while (low < high) {
        int mid = low + (high - low) / 2;
 
        // arr[mid]가 target보다 크거나 같으면,
        // mid는 잠재적인 답이 될 수 있으므로 high를 mid로 좁힘
        if (arr[mid] >= target) {
            high = mid;
        } 
        // arr[mid]가 target보다 작으면,
        // mid는 답이 될 수 없으므로 low를 mid + 1로 좁힘
        else {
            low = mid + 1;
        }
    }
    return low; // 또는 high를 반환해도 동일
}

Upper Bound

target 초과하는 값이 배열에서 처음 나타나는 인덱스 반환

즉, arr[index] > target 을 만족하는 가장 작은 index 찾는다.

    // arr에서 target을 초과하는 값이 처음 나타나는 인덱스를 반환 (upper_bound)
    // target 값이 없다면, target이 삽입될 위치를 반환
    public static int upperBound(int[] arr, int target) {
        int low = 0;
        int high = arr.length; // high를 배열 길이로 설정하는 것이 핵심
 
        // low와 high가 같아질 때까지 반복
        while (low < high) {
            int mid = low + (high - low) / 2;
 
            // arr[mid]가 target보다 크면,
            // mid는 잠재적인 답이 될 수 있으므로 high를 mid로 좁힘
            if (arr[mid] > target) {
                high = mid;
            } 
            // arr[mid]가 target보다 작거나 같으면,
            // mid는 답이 될 수 없으므로 low를 mid + 1로 좁힘
            else {
                low = mid + 1;
            }
        }
        return low; // 또는 high를 반환해도 동일
    }