N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 예를 들어 수열 {1, 1, 2, 2, 2, 2, 3}이 있을 때 x = 2라면, 현재 수열에서 값이 2인 원소가 4개이므로 4를 출력합니다.
단, 이 문제는 시간 복잡도 O(log N)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.
입출력 예시 1
7 2
1 1 2 2 2 2 3
4
입출력 예시 2
7 4
1 1 2 2 2 2 3
-1
const first = (array, target, start, end) => {
if (start > end) {
return -1;
}
const mid = Math.floor((start + end) / 2);
if (mid === 0 || array[mid - 1] < target && array[mid] === target) {
return mid;
} else if (array[mid] < target) {
return first(array, target, mid + 1, end);
} else {
return first(array, target, start, mid - 1);
}
}
const last = (array, target, start, end) => {
if (start > end) {
return -1;
}
const mid = Math.floor((start + end) / 2);
if (mid === array.length - 1 || array[mid + 1] > target && array[mid] === target) {
return mid;
} else if (array[mid] <= target) {
return last(array, target, mid + 1, end);
} else {
return last(array, target, start, mid - 1);
}
}
const solution = (N, x, datas) => {
const f = first(datas, x, 0, N);
if (f === -1) {
console.log(-1);
return;
}
const l = last(datas, x, 0, N);
console.log(l - f + 1);
}
solution(7, 2, [1, 1, 2, 2, 2, 2, 3]);
처음엔 재귀함수가 아닌 while문을 이용해서 해결하려고 했는데, 조건문이 이진 탐색과 조금 다르다보니 무한루프에 빠지게 되었다. (코드를 잘못 작성했을 수도 있다.) 그래서 재귀함수로 바꿔 풀었다. 정답을 보고 푼 소스코드라 언어만 다르고 코드는 거의 유사하다.