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

JavaScript로 특정 숫자 집합에서 가장 가까운 큰 숫자 찾는 방법

숫자들의 집합이 주어졌을 때, 함수의 입력값으로 전달된 특정 숫자와 같거나 그보다 큰 수 중 가장 가까운 값을 가진 키(key)를 찾아야 하는 경우가 있습니다.

예를 들어, 다음과 같은 숫자 집합이 정의되어 있다고 가정해 보겠습니다.

const numbers = {
    A:107,
    B:112,
    C:117,
    D:127,
    E:132,
    F:140,
    G:117,
    H:127,
    I:132,
    J:132,
    K:140,
    L:147,
    M:117,
    N:127,
    O:132
};

해결 접근 방식

이 문제는 reduce() 메서드를 활용하면 간결하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.

  • 객체의 모든 키를 순회하면서 각 값과 입력값의 차이(difference)를 계산합니다.
  • 차이가 0 이상(즉, 입력값보다 크거나 같은 수)이면서 기존에 저장된 최소 차이보다 작은 경우, 해당 키를 결과로 저장합니다.
  • 초기 diff 값은 Infinity로 설정하여 어떤 유효한 차이보다도 크게 만듭니다.

이렇게 하면 조건을 만족하는 여러 키 중에서 입력값과의 차이가 가장 작은, 즉 '가장 가까운 큰 숫자'에 해당하는 키만 남게 됩니다.

예제 코드

전체 구현 코드는 다음과 같습니다.

const numbers = {
    A:107,
    B:112,
    C:117,
    D:127,
    E:132,
    F:140,
    G:117,
    H:127,
    I:132,
    J:132,
    K:140,
    L:147,
    M:117,
    N:127,
    O:132
};
const nearestHighest = (obj, val) => {
    let diff = Infinity;
    const nearest = Object.keys(obj).reduce((acc, key) => {
        let difference = obj[key] - val;
        if (difference >= 0 && difference < diff) {
            diff = difference;
            acc = [key];
        }
        return acc;
    }, [])
    return nearest;
};
console.log(nearestHighest(numbers, 140));

실행 결과

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

['F']

입력값이 140일 때, 객체에서 140과 같거나 그보다 큰 값들은 F(140), K(140), L(147)입니다. 이 중 가장 가까운 값은 140이며, reduce가 앞선 키부터 순회하므로 처음 발견된 'F'가 최종 결과로 반환됩니다.

참고 사항

동일한 값을 가진 키가 여러 개 존재할 경우(F와 K처럼), 이 코드는 먼저 등장한 키 하나만 반환합니다. 만약 조건을 만족하는 모든 키를 얻고 싶다면, acc 배열에 push하는 방식으로 코드를 수정하면 됩니다. 또한 배열 형태의 데이터라면 Object.keys 대신 배열 메서드를 직접 사용해도 같은 로직을 적용할 수 있습니다.