오마르의 버그
면접 대비시간 제한1초메모리 제한128 MB
N, X와 정오 구분이 주어질 때 버그 있는 이진 탐색이 정답이나 오답을 내도록 사전 순으로 가장 작은 정렬 배열을 구성합니다.
문제
오마르는 세계에서 가장 어린 프로그래머다. 태어난 지 11개월밖에 되지 않았다. 이진 탐색 설명을 읽고 직접 구현해 보기로 했다.
오마르가 작성한 함수는 다음과 같다. 문법은 올바르고, C++와 Java에서 똑같이 동작한다.
int findFirstGreaterThanOrEqual(int array[], int N, int X) {
int start = 0, end = N;
while (start < end) {
int middle = (start + end) / 2;
if (array[middle] > X) {
end = middle;
} else {
start = middle + 1;
}
}
return start;
}
이 함수는 항상 다음 조건을 모두 만족하는 인자로 호출된다.
- 첫 번째 인자는 정수를 1개 이상 99개 이하 담은 배열이다.
- 배열의 정수는 서로 다르고, 증가하는 순서로 정렬되어 있다.
- 배열의 정수는 모두 양수이고 100 이하다.
- 은 배열의 원소 개수다.
- 는 100 이하의 양의 정수다.
오마르가 원하는 동작은 이렇다. 배열에 보다 크거나 같은 정수가 없으면 함수는 을 반환한다. 그렇지 않으면 보다 크거나 같은 정수 중 가장 작은 값의 인덱스를 반환한다. 첫 번째 원소의 인덱스는 0이다.
그런데 함수에 버그가 있어서 어떤 입력에서는 잘못된 값을 반환한다. 오마르는 너무 어려서 버그를 찾지 못한다. 함수를 시험할 배열을 만들어 오마르를 도와주자.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다 ().
이어지는 개의 줄에 테스트 케이스가 한 줄씩 주어진다. 각 줄에는 공백 하나로 구분된 정수 세 개 가 있다 (, , ). 은 두 번째 인자의 값이고 는 세 번째 인자의 값이다. 가 1이면 그 인자로 함수를 호출했을 때 올바른 값을 반환하게 하는 배열을 만들어야 한다. 가 2이면 잘못된 값을 반환하게 하는 배열을 만들어야 한다. 어느 쪽이든 배열은 위 조건을 만족해야 한다.
올바른 값인지 잘못된 값인지는 코드가 실제로 하는 동작이 아니라 오마르가 원하는 동작을 기준으로 판단한다.
출력
각 테스트 케이스마다 만든 배열의 정수 개를 배열에 놓인 순서대로 공백 하나로 구분해 한 줄에 출력한다. 조건을 만족하는 배열이 여러 개면 사전순으로 가장 앞선 것을 출력한다.
길이가 같은 두 배열을 비교할 때, 처음으로 값이 달라지는 인덱스에 더 작은 값이 놓인 배열이 사전순으로 앞선다.