문제 소개
이번 글에서는 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이 오름차순으로 올바르게 반환된 것을 확인할 수 있습니다.