<문제 조건>
[0, 1, 3, 5, 5, 5, 7, 9, 9, 10, 10, 12, 14] 배열에서 9의 lower bound를 찾아라
public static int getLowerBound(int[] arr, int h){
int l = 0, r = arr.length-1;
while(l <= r) {
int mid = (l + r) / 2;
if (arr[mid] < h) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
뭐가 잘못됐을까요?
while문을 빠져나가기 위해서는 l > r
의 조건이 성립해야만 합니다.
하지만 r
의 범위는 mid
로 좁혀지기만 합니다.
즉, arr[mid] >= h
인 상황에서, r의 범위는 항상 l
보다 크거나 같을 수 밖에 없습니다.
따라서, r = mid
로 조건이 좁혀지는 상황에서는 l==r
의 조건에 무조건 걸릴 수밖에 없다.
따라서, 다음과 같이 구현해야
public static int getLowerBound(int[] arr, int h){
int l = 0, r = arr.length-1;
while(l < r) {
int mid = (l + r) / 2;
if (arr[mid] < h) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
while(l <= r)
인 조건하에선 어떻게 반복문을 빠져나올 수 있을까?
이 때의 경우에는 r = mid-1
의 조건이 붙여져야한다.
조건에 맞추어서 달리 작성하자.