[JS] Q27 정렬된 배열에서 특정 수의 개수 구하기

Hadam Cho·2021년 4월 20일
1

Algorithm

목록 보기
23/32
post-custom-banner

문제

N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 예를 들어 수열 {1, 1, 2, 2, 2, 2, 3}이 있을 때 x = 2라면, 현재 수열에서 값이 2인 원소가 4개이므로 4를 출력합니다.

단, 이 문제는 시간 복잡도 O(log N)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.


입력 조건

  • 첫째 줄에 N과 x가 정수 형태로 공백으로 구분되어 입력됩니다.
    (1 ≤ N ≤ 1,000,000), (-10⁹ ≤ x ≤ 10⁹)
  • 둘째 줄에 N개의 원소가 정수 형태로 공백으로 구분되어 입력됩니다.
    (-10⁹ ≤ 각 원소의 값 ≤ 10⁹)

출력 조건

  • 수열의 원소 중에서 값이 x인 원소의 개수를 출력합니다. 단, 값이 x인 원소가 하나도 없다면 -1을 출력합니다.

입출력 예시

입출력 예시 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문을 이용해서 해결하려고 했는데, 조건문이 이진 탐색과 조금 다르다보니 무한루프에 빠지게 되었다. (코드를 잘못 작성했을 수도 있다.) 그래서 재귀함수로 바꿔 풀었다. 정답을 보고 푼 소스코드라 언어만 다르고 코드는 거의 유사하다.

profile
(。・∀・)ノ゙
post-custom-banner

0개의 댓글