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

JavaScript 배열에서 특정 숫자와 가장 가까운 값 찾기

숫자로 이루어진 배열과 하나의 숫자를 입력받아, 배열 안에 존재하는 값 중 그 숫자에 가장 가까운 값을 반환하는 함수를 작성해야 한다고 가정해 봅시다.

예를 들면 다음과 같습니다.

closest([45,61,53,98,54,12,69,21], 67); // 69
closest([45,61,53,98,54,12,69,21], 64); // 61

그럼 이 기능을 구현하는 코드를 작성해 보겠습니다.

접근 방식: Array.prototype.reduce() 활용

이 문제는 Array.prototype.reduce() 메서드를 사용하면 간결하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.

  • 배열의 각 요소와 목표 숫자 사이의 절댓값 차이를 계산합니다.
  • reduce 반복 과정에서 지금까지 발견한 가장 작은 차이보다 더 작은 차이가 나오면 해당 값을 새로운 누적값으로 저장합니다.
  • 최종적으로 얻은 '가장 작은 차이'에 원래 찾으려던 숫자를 다시 더하면, 그것이 바로 배열에서 가장 가까운 값이 됩니다.

초기 누적값을 Infinity로 설정하면 첫 번째 비교에서 어떤 값이든 무조건 교체되므로 안전하게 시작할 수 있습니다.

구현 예제

const closest = (arr, num) => {
    return arr.reduce((acc, val) => {
        if(Math.abs(val - num) < Math.abs(acc)){
            return val - num;
        }else{
            return acc;
        }
    }, Infinity) + num;
}
console.log(closest([45,61,53,98,54,12,69,21], 67));
console.log(closest([45,61,53,98,54,12,69,21], 64));

실행 결과

위 코드를 콘솔에서 실행하면 다음과 같은 결과가 출력됩니다.

69
61

코드 동작 원리 살펴보기

첫 번째 호출인 closest([45,61,53,98,54,12,69,21], 67)을 예로 들어 보겠습니다.

  • 각 요소와 67의 차이는 순서대로 |45-67|=22, |61-67|=6, |53-67|=14, |98-67|=31, |54-67|=13, |12-67|=55, |69-67|=2, |21-67|=46 입니다.
  • 이중 가장 작은 차이는 2이며, 이는 69에서 나온 값입니다.
  • reduce가 반환하는 값은 69-67=2이고, 여기에 67을 더하면 최종 결과는 69가 됩니다.

두 번째 호출에서도 같은 원리로 64와의 차이가 가장 작은 61이 결과로 반환됩니다.

주의할 점

이 구현 방식은 코드가 짧고 직관적이라는 장점이 있지만, 몇 가지 유의사항이 있습니다.

  • 차이가 동일한 두 값이 존재할 경우(예: 60과 70 사이에서 65를 찾는 경우), 먼저 등장하는 요소가 우선 선택됩니다.
  • reduce 내부에서 차이값만 추적하기 때문에, 실제 가장 가까운 '요소 자체'가 필요하다면 누적값으로 차이 대신 요소를 저장하거나 객체 형태로 관리하도록 수정하는 것이 좋습니다.

이처럼 reduce()를 활용하면 별도의 정렬이나 반복문 없이 한 줄의 함수로 배열에서 가장 가까운 숫자를 손쉽게 찾을 수 있습니다.