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

JavaScript로 정렬된 배열의 요소 간 거리(차이) 구하기

문제 개요

오름차순으로 정렬된 숫자 배열이 있다고 가정해 보겠습니다.

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 ] ]