이번 글에서는 숫자 배열을 첫 번째 인수로, 하나의 숫자를 두 번째 인수로 받는 JavaScript 함수를 작성해 보겠습니다.
이 함수의 역할은 배열에 포함된 숫자들 중에서 두 번째 인수로 전달된 값(목표 값)과 가장 가까운 숫자를 찾아, 해당 숫자의 인덱스를 반환하는 것입니다.
동작 원리
가장 가까운 값을 찾는 핵심 아이디어는 다음과 같습니다.
- 배열을 처음부터 끝까지 순회하면서 각 요소와 목표 값 사이의 절댓값 차이를 계산합니다.
- 현재까지 발견한 최소 차이보다 더 작은 차이를 가진 요소가 나타나면, 그 요소의 인덱스를 저장합니다.
- 순회가 끝나면 저장된 인덱스가 곧 목표 값과 가장 가까운 요소의 위치입니다.
예제 코드
const arr = [0, 65, 131, 196, 259, 323, 388, 453, 517];
const target = 425;
const findClosest = (arr, target) => {
let min;
let chosen = 0;
for (let i in arr) {
min = Math.abs(arr[chosen] - target);
if (Math.abs(arr[i] - target) < min) {
chosen = i;
}
}
return chosen;
};
console.log(findClosest(arr, target));코드 설명
위 코드에서 Math.abs() 메서드는 두 값의 차이를 항상 양수로 만들어 주므로, 목표 값보다 크거나 작은 경우 모두 동일한 기준으로 비교할 수 있습니다. 변수 chosen은 현재까지 가장 가까운 요소의 인덱스를 추적하며, 반복문 안에서 더 가까운 요소를 발견할 때마다 갱신됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
7
목표 값 425와 가장 가까운 배열의 요소는 인덱스 7에 있는 453입니다. 실제로 |425 - 453| = 28로, 나머지 어떤 요소보다도 차이가 작기 때문에 함수는 7을 반환하게 됩니다.