나름 증명을 해보았습니다.
편의상 문제의 정답을 A라고 합시다.
count_below(middle) >= k라는 조건은 middle>A로 표현할 수 있겠습니다.
먼저 실행 초기에는 left<=A<=right이 성립하며, 이 조건을 만족하는 한 각 반복문의 실행 시마다 다음 세 가지 경우로 나눌 수 있습니다.
case 1: middle>A인 경우
이 경우 right <- middle-1이므로 다시 left<=A<=right이 성립하게 됩니다.
case 2: middle<A인 경우
이 경우 left <- middle+1으로 다시 left<=A<=right이 성립하게 됩니다.
case 3: middle=A인 경우
이 경우 일단 left <- middle+1이 실행되어 다시 다음과 같은 두 경우로 나눌 수 있습니다.
case 3-1: right=A인 경우
이 경우 left>right이 되어 바로 실행이 끝나며, 정답이 출력됩니다.
case 3-2: right>A인 경우
이 경우 left=A+1<=right이며 이 이후로 생성되는 모든 middle>A입니다. 즉, left>right이 되기 전까지 항상 right <- middle-1 연산만이 실행되며, 즉 루프 종료시 right=A가 되어 정답이 출력됩니다.
추가로, 루프가 언젠가 종료된다는 사실은 아마 어떻게든 쉽게 증명될 겁니다.
2wjdwo97 2년 전
이분 탐색 방법을 이용해서 풀긴 했는데요...
count_below 함수 말고 메인 코드 부분을 보면
0 ~ N^2 사이에서 이분 탐색을 진행했습니다.
0 ~ N^2 중 A의 배열에 없는 수도 있으므로
( => 예를 들면 3 x 3 배열에는 5라는 숫자가 없음 )
머릿속에서는, 만약 이분 탐색을 진행하다가
없는 수를 만나서 조건이 맞아 떨어지게 되면 틀린 답이 출력될 것이라 생각했습니다.
근데 왜 맞았을까요? ㅠㅠ