문제 개요
오름차순으로 정렬된 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [2, 5, 7, 8, 9];
우리는 이러한 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 입력 배열의 각 요소에 대해 새로운 하위 배열(subarray)을 생성해야 하며, 하위 배열에는 해당 요소와 그 뒤에 오는 요소들을 하나씩 비교한 차이값들이 포함되어야 합니다.
동작 원리 이해하기
첫 번째 배열 요소인 2를 기준으로 계산하면 다음과 같습니다.
5 - 2 = 3
7 - 2 = 5
8 - 2 = 6
9 - 2 = 7
따라서 첫 번째 요소에 대한 하위 배열은 아래와 같습니다.
[3, 5, 6, 7]
같은 방식으로 두 번째 요소 5, 세 번째 요소 7, 네 번째 요소 8에 대한 하위 배열은 각각 다음과 같습니다.
[2, 3, 4]
[1, 2]
[1]
마지막 요소인 9는 그 뒤에 비교할 요소가 없으므로 결과에서 제외합니다.
결국 전체 배열에 대한 최종 출력은 다음과 같아야 합니다.
const output = [
[3, 5, 6, 7],
[2, 3, 4],
[1, 2],
[1]
];
구현 예제
재귀 함수를 활용하여 이 문제를 해결하는 코드는 다음과 같습니다.
const arr = [2, 5, 7, 8, 9];
const distanceBetween = (arr, r = []) => {
if (r.length <= arr.length - 2) {
let temp = [];
let b = arr[r.length]; // 기준이 되는 요소
arr.forEach(e => temp.push(e - b)); // 모든 요소와의 차이 계산
r.push(temp.filter(e => e > 0)); // 양수인 값만 남김
return distanceBetween(arr, r); // 다음 요소로 재귀 호출
} else {
return r;
}
}
console.log(distanceBetween(arr));
코드 설명
r는 최종 결과를 담는 누적 배열입니다. 초기값은 빈 배열로 설정됩니다.- 기준 요소
b는 현재까지 처리된 결과의 길이(r.length)를 인덱스로 사용하여 선택됩니다. forEach를 통해 기준 요소와 모든 배열 요소의 차이를 계산한 후,filter(e => e > 0)로 자기 자신보다 앞선 요소들의 음수 차이값을 제거합니다.- 조건이 충족될 때까지 재귀적으로 호출되며, 마지막 요소 직전까지 처리가 끝나면 누적된 결과 배열을 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ 3, 5, 6, 7 ], [ 2, 3, 4 ], [ 1, 2 ], [ 1 ] ]