직접 이진탐색을 짜서 쓰는데 두 가지 문제가 겹쳐서 도움 요청드립니다. 평소 작은 배열에서는 잘 도는데 특정 상황에서만 터져서 원인을 못 찾겠어요.
일단 중간값 계산을 이렇게 했거든요.
int mid = (lo + hi) / 2;
배열이 아주 클 때 결과가 음수로 튀거나 엉뚱한 인덱스가 나오는 경우가 있었어요. lo하고 hi가 둘 다 크면 lo + hi가 int 범위를 넘어서 그런 거 같기도 하고요.
그리고 경계를 이렇게 좁혔더니
if (arr[mid] < target) {
lo = mid;
} else {
hi = mid;
}
구간이 딱 두 칸 남았을 때 lo가 안 움직이면서 while이 영원히 안 끝나더라고요. 이 두 개를 어떻게 고쳐야 안전하게 도는지, 그리고 경계를 mid로 두느냐 mid 옆으로 두느냐 기준이 뭔지도 알려주시면 감사하겠습니다.