이번 글에서는 첫 번째 인자로 숫자 배열, 두 번째 인자로 하나의 숫자를 받아, 배열 안에서 두 번째 인자로 주어진 숫자와 가장 가까운 값을 찾아 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 다음과 같은 배열과 숫자가 있다고 가정해 봅시다.
const arr = [34, 67, 31, 53, 89, 12, 4]; const num = 41;
41과 가장 가까운 숫자는 차이가 7인 34이므로, 함수의 결과값은 34가 되어야 합니다.
구현 아이디어
핵심 로직은 간단합니다. 배열을 처음부터 끝까지 순회하면서 각 요소와 목표 숫자 사이의 절댓값 차이를 계산하고, 그중 차이가 가장 작은 요소를 기억하면 됩니다.
- 배열의 첫 번째 요소를 초기 '가장 가까운 값'으로 설정합니다.
- 목표 숫자와의 차이(절댓값)를 초기 기준값으로 저장합니다.
- 배열을 순회하며 새로 계산한 차이가 기존 기준값보다 작으면, 해당 요소와 차이를 새로운 기준으로 갱신합니다.
- 순회가 끝나면 마지막에 남은 값을 반환합니다.
예제 코드
위 로직을 구현한 코드는 다음과 같습니다.
const arr = [34, 67, 31, 53, 89, 12, 4];
const num = 41;
const findClosest = (arr = [], num) => {
let curr = arr[0];
let diff = Math.abs(num - curr);
for (let val = 0; val < arr.length; val++) {
let newdiff = Math.abs(num - arr[val]);
if (newdiff < diff) {
diff = newdiff;
curr = arr[val];
}
}
return curr;
};
console.log(findClosest(arr, num));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
34
추가 팁: reduce()를 활용한 간결한 방법
같은 로직을 Array.prototype.reduce() 메서드를 사용하면 더욱 간결하게 표현할 수 있습니다.
const findClosest = (arr = [], num) => arr.reduce((closest, current) => Math.abs(num - current) < Math.abs(num - closest) ? current : closest );
두 방법 모두 시간 복잡도는 O(n)으로 동일하지만, reduce() 버전은 코드가 짧고 가독성이 좋다는 장점이 있습니다. 상황에 맞게 선택하여 사용하시면 됩니다.