728x90
- 코딩테스트에서는 정렬된 배열에서 값이 특정 범위에 해당하는 원소의 개수를 계산하는 것을 요구하는 경우가 종종 있다.
- 이러한 문제를 해결하기 위해 lowerBound() 함수와 upperBound()함수를 사용할 수 있다.
- lowerBound(arr,x): 정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 왼쪽 인덱스 반환 => 하한선을 구함
- upperBound(arr,x):정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 오른쪽 인덱스를 반환 => 상한선을 구함
- upperBound-lowerBound = 특정 점위에 해당하는 원소의 개수
1. lowerBound() 코드
function lowerBound(arr,target,start,end){
while(start<end){
let mid= parseInt((start+end)/2)
if(arr[mid]>=target) end = mid; // 최대한 왼쪽으로 이동하기
else start=mid+1
}
return end
}
2.upperBound()코드
function upperBound(arr,target,start,end){
while(start<end){
let mid= parseInt((start+end)/2)
if(arr[mid]>target) end=mid
else start=mid+1 // 최대한 오른쪽으로 이동하기
}
}
3.countByRange()
function countByRange(arr,leftValue,rightValue){
let rightIndex=upperBound(arr,rightValue,0,arr.length)
let leftIndex=lowerBound(arr,leftValue,0,arr.length);
return rightIndex-leftIndex
}
728x90
'알고리즘' 카테고리의 다른 글
이진탐색 문제 풀이1 (0) | 2023.05.01 |
---|---|
3. 파라메트릭 서치 이해하기 (0) | 2023.05.01 |
1. 이진 탐색 알고리즘 이해하기 (0) | 2023.04.30 |
프로그래머스 > 코딩 테스트 연습 > 연속 부분 수열의 합 (0) | 2023.04.26 |
그리디 문제풀이(3) (0) | 2023.04.23 |