더이상 이분탐색의 무한 루프 조건문에 빠지지 말자

김태훈·2024년 5월 7일
0
post-thumbnail

<문제 조건>
[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 조건문에 등호가 포함된다면?

while(l <= r) 인 조건하에선 어떻게 반복문을 빠져나올 수 있을까?
이 때의 경우에는 r = mid-1의 조건이 붙여져야한다.
조건에 맞추어서 달리 작성하자.

profile
기록하고, 공유합시다

0개의 댓글