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

JavaScript로 정렬된 배열에서 목표 숫자에 가장 가까운 두 요소 찾기

문제 소개

이번 글에서는 JavaScript를 활용해 다음과 같은 문제를 해결하는 함수를 작성해 보겠습니다.

함수의 첫 번째 인수로 정렬된 정수 배열(arr)을, 두 번째 인수로 목표 숫자(target)를 전달받습니다. 그리고 배열 arr 안에 실제로 존재하는 숫자 중에서 목표 숫자에 가장 가까운 두 개의 요소를 찾아 반환해야 합니다.

이때 주의할 점은 두 가지입니다.

1. 반환되는 배열에는 반드시 두 개의 숫자만 포함되어야 합니다.
2. 결과 배열 역시 오름차순(증가하는 순서)으로 정렬되어 있어야 합니다.

입력 및 출력 예시

예를 들어, 함수에 아래와 같은 값을 입력한다고 가정해 보겠습니다.

입력

const arr = [1, 2, 3, 4, 5];
const target = 3;

목표 숫자 3에 가장 가까운 두 요소는 2와 3이므로, 함수는 다음과 같은 결과를 반환해야 합니다.

출력

const output = [2, 3];

구현 코드

이 문제는 배열을 목표 숫자까지의 거리 기준으로 정렬한 뒤, 앞에서 두 개의 요소만 잘라내고 다시 오름차순으로 정렬하는 방식으로 간단하게 해결할 수 있습니다. 코드는 다음과 같습니다.

const arr = [1, 2, 3, 4, 5];
const target = 3;

const findClosest = (arr = [], target = 1) => {
    const size = 2;
    return arr.sort((a, b) => {
        const distanceA = Math.abs(a - target);
        const distanceB = Math.abs(b - target);
        // 거리가 같다면 숫자 자체의 크기순으로 정렬
        if (distanceA === distanceB) {
            return a - b;
        }
        return distanceA - distanceB;
    }).slice(0, size)
    .sort((a, b) => a - b); // 최종적으로 오름차순 정렬
};

console.log(findClosest(arr, target));

코드 동작 원리

1. 거리 계산: Math.abs()를 사용해 각 요소와 목표 숫자 사이의 절댓값 거리를 구합니다.
2. 정렬 기준: 거리가 가까운 순서대로 배열을 정렬하며, 거리가 같은 경우에는 더 작은 숫자가 앞에 오도록 처리합니다.
3. 요소 추출: slice(0, size)를 통해 가장 가까운 두 개의 요소만 선택합니다.
4. 최종 정렬: 문제의 요구사항에 맞게 결과 배열을 다시 오름차순으로 정렬합니다.

실행 결과

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

[2, 3]

배열 [1, 2, 3, 4, 5]에서 목표 숫자 3에 가장 가까운 두 요소인 2와 3이 오름차순으로 올바르게 반환된 것을 확인할 수 있습니다.