Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 특정 숫자와 가장 가까운 요소의 인덱스 찾기

다음과 같은 배열이 있다고 가정해 보겠습니다.

const arr = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

이 배열과 하나의 숫자 n을 입력받아, 배열 내에서 n과 가장 가까운 값의 인덱스를 반환하는 JavaScript 함수를 작성해야 합니다. 예를 들어 n이 150이라면, 배열에서 150에 가장 가까운 값은 162이므로 해당 값의 인덱스인 4가 결과로 출력되어야 합니다.

구현 아이디어

핵심 원리는 매우 간단합니다. 배열을 처음부터 끝까지 순회하면서 각 요소와 목표 숫자 사이의 절대적인 차이(거리)를 계산하고, 그 차이가 지금까지 기록된 최소 차이보다 작을 때마다 현재 요소의 인덱스를 저장하는 것입니다. 모든 요소를 확인한 후 마지막으로 저장된 인덱스가 곧 가장 가까운 요소의 인덱스가 됩니다.

예제 코드

const arr = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

const closestIndex = (num, arr) => {
   let curr = arr[0], diff = Math.abs(num - curr);
   let index = 0;
   for (let val = 0; val < arr.length; val++) {
      let newdiff = Math.abs(num - arr[val]);
      if (newdiff < diff) {
         diff = newdiff;
         curr = arr[val];
         index = val;
      }
   }
   return index;
};

console.log(closestIndex(150, arr));

코드 설명

  • curr: 현재까지 발견한 가장 가까운 값을 저장하며, 초기값은 배열의 첫 번째 요소입니다.
  • diff: 목표 숫자와 curr 사이의 절대 차이를 저장합니다.
  • index: 가장 가까운 요소의 인덱스를 저장합니다.
  • Math.abs(): 두 숫자 사이의 거리를 계산하기 위해 절댓값을 구합니다.

루프가 진행되는 동안 새로 계산된 차이(newdiff)가 기존 최소 차이(diff)보다 작으면 세 변수를 갱신합니다. 배열 전체를 단 한 번만 순회하므로 이 알고리즘의 시간 복잡도는 O(n)으로 효율적입니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 출력이 표시됩니다.

4

n이 150일 때 배열에서 가장 가까운 값은 인덱스 4에 위치한 162입니다. 150과 162의 차이는 12로, 다른 어떤 요소와의 차이보다도 작기 때문입니다.

추가 팁

배열이 오름차순으로 정렬되어 있다면 이진 탐색(binary search)을 활용하여 O(log n)의 시간 복잡도로 더욱 빠르게 해결할 수 있습니다. 또한 두 요소가 목표 숫자와 정확히 같은 거리에 있는 경우(동률), 이 코드는 먼저 발견된 요소를 선택한다는 점도 참고하시기 바랍니다.