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

JavaScript로 배열을 내림차순 정렬한 뒤 연속된 요소 간 차이의 합 구하기

문제 소개

이번 글에서는 JavaScript 함수를 작성해 보겠습니다. 이 함수는 정수로 이루어진 배열을 인자로 받아, 배열을 내림차순으로 정렬한 다음 인접한 두 요소 사이의 차이를 모두 더한 값을 반환해야 합니다.

예를 들어 배열이 다음과 같다고 가정해 보겠습니다.

[6, 2, 15]

내림차순으로 정렬하면 [15, 6, 2]가 되고, 따라서 기대하는 출력 결과는 다음과 같습니다.

(15 - 6) + (6 - 2) = 13

풀이 접근 방법

이 문제는 다음 단계로 해결할 수 있습니다.

1. sort() 메서드와 비교 함수 (a, b) => b - a를 사용해 배열을 내림차순으로 정렬합니다.
2. 배열의 길이가 1 이하라면 차이를 계산할 쌍이 없으므로 0을 반환합니다.
3. 반복문을 돌며 현재 요소에서 바로 다음 요소를 뺀 값을 누적합니다.
4. 최종 누적합을 반환합니다.

예제 코드

다음은 위 로직을 구현한 전체 코드입니다.

const arr = [6, 2, 15];

const sumDifference = (arr = []) => {
    // 배열을 내림차순으로 정렬
    const descArr = arr.sort((a, b) => b - a);

    // 요소가 1개 이하면 차이를 계산할 수 없음
    if (descArr.length <= 1) {
        return 0;
    }

    let total = 0;
    for (let i = 0; i < descArr.length - 1; i++) {
        total += (descArr[i] - descArr[i + 1]);
    }
    return total;
};

console.log(sumDifference(arr));

실행 결과

13

코드 설명 및 추가 팁

내림차순으로 정렬된 배열에서는 항상 앞의 요소가 뒤의 요소보다 크거나 같기 때문에, 각 차이 descArr[i] - descArr[i + 1]는 음수가 되지 않습니다. 흥미로운 점은 이렇게 계산한 값이 결국 최댓값과 최솟값의 차이, 즉 Math.max(...arr) - Math.min(...arr)와 동일하다는 것입니다. 중간 요소들은 더할 때와 뺄 때 한 번씩 등장해 서로 상쇄되기 때문입니다.

따라서 성능이 중요한 경우에는 정렬 없이 O(n) 시간 복잡도로 아래처럼 해결할 수도 있습니다.

const sumDifferenceOptimized = (arr = []) => {
    if (arr.length <= 1) return 0;
    return Math.max(...arr) - Math.min(...arr);
};

다만 문제의 의도대로 정렬 과정을 포함해야 한다면 첫 번째 방식을 그대로 사용하면 됩니다. 참고로 원본 배열이 변경되는 것이 부담스럽다면 [...arr].sort((a, b) => b - a)처럼 스프레드 연산자로 복사본을 만들어 정렬하는 것이 안전합니다.