Upper Bound Search and Lower Bound Search ( c++/ python)

1 분 소요

정렬된 배열에서 target 값이 존재할 때 target 값을 초과하는 값들 중 첫번째 위치를 반환한다.

1. CPP

int upperBound(vector<int>& arr, int target) {
	int left = 0, right = arr.size() - 1;
	while(left < right) {
		int mid = (left + right) / 2;
		
		if(arr[mid] <= target) {
			left = mid + 1;
		}
		else {
			right = mid;
		}
	}
	return right;
}

2. Python

def upperbound(arr: List[int], target: int) -> int:
	left, right = 0, len(arr) - 1
	
	while (left < right):
		mid = (left + right) // 2
						
		if(arr[mid] <= target):
			left = mid + 1
		else:
			right = mid
			
	return right

Upper Bound Search의 목적은 target의 값보다 큰 첫번째 값의 위치를 찾는 것이다. 따라서,

arr[mid] <= target:
	left = mid + 1

위 와 같이 처리를 해주는 것은 target의 값과 비교해서 그 이하인 값을 찾았을 때, left 값을 움직여 target의 값보다 큰 첫번째 값의 위치를 찾기 위해서이다.

정렬된 배열에서 target 값이 존재할 때 target 값보다 크거나 같은 값들의 첫번째 위치를 반환한다.

1. CPP

int lowerBound(vector<int>& arr, int target) {
	int left = 0, right = arr.size() - 1;
	while(left < right) {
		int mid = (left + right) / 2;
		
		if(arr[mid] < target) {
			left = mid + 1;
		}
		else {
			right = mid;
		}
	}
	return right;
}

2. Python

def lowerbound(arr: List[int], target: int) -> int:
	left, right = 0, len(arr) - 1
	
	while (left < right):
		mid = (left + right) // 2
						
		if(arr[mid] < target):
			left = mid + 1
		else:
			right = mid
			
	return right

Lower Bound Search의 목적은 target의 값보다 크거나 같은 첫번째 값의 위치를 찾는 것이다. 따라서,

arr[mid] < target:
	left = mid + 1

위 와 같이 처리를 해주는 것은 target 값보다 작은 값을 찾았을 때, left값을 움직여 target의 값보다 크거나 같은 첫번째 값의 위치를 찾기 위해서이다.

댓글남기기