다음 숫자 배열을 고려하십시오 -
const arr = [10, 5, 6, 12, 7, 1];
모든 이동에서 요소를 하나 적게 차지하는 연속 요소의 합은 -
[10, 5, 6, 12, 7, 1] = 10 + 5 + 6 + 12 + 7 + 1 = 41; [5, 6, 12, 7, 1] = 5 + 6 + 12 + 7 + 1 = 31; [6, 12, 7, 1] = 6 + 12 + 7 + 1 = 26; [12, 7, 1] = 12 + 7 + 1 = 20; [7, 1] = 7 + 1 = 8; [1] = 1 = 1;
따라서 최종 출력은 다음과 같은 배열이어야 합니다. -
[ 41, 31, 26, 20, 8, 1 ]
위의 예와 같이 이러한 배열 중 하나를 가져와서 partialSum 배열을 반환하는 함수를 작성해야 합니다.
접근법 1:map()과 reduce()를 함께 사용
여기서 아이디어는 간단합니다. 배열의 모든 요소에 대해 하나의 특정 요소를 반환해야 하기 때문에 정확히 이 작업을 수행하는 Array.prototype.map() 메서드를 사용할 수 있습니다.
그리고 특정 인덱스를 비교하여 필요한 요소의 축소된 합계를 반환하는 map() 메서드를 만들면 작업이 완료됩니다.
다음은 이 작업을 수행하는 코드입니다. -
const arr = [10, 5, 6, 12, 7, 1]; const partSum = arr.map((item, index) => { return arr.reduce((acc, val, ind) => { return ind >= index ? acc+val : acc; }, 0); }); console.log(partSum);
접근법 2:재귀 함수 사용
여기서 우리는 두 개의 재귀 함수를 사용할 것입니다.
-
첫 번째는 인덱스 시작부터 끝까지의 요소 합계를 반환하는 sumRecursively(arr, start)입니다.
-
두 번째는 필요한 합계를 배열에 재귀적으로 연결하고 배열의 끝에 도달하면 연결된 배열을 반환하는 partSumRecursively()입니다.
이 작업을 수행하는 코드는 -
입니다.예시
const arr = [10, 5, 6, 12, 7, 1]; const sumRecursively = (arr, start = 0, res = 0) => { if(start < arr.length){ return sumRecursively(arr, start+1, res+arr[start]); }; return res; }; const partSumRecursively = (arr, partSum = [], start = 0, end = arr.length-1) => { if(start <= end){ return partSumRecursively(arr, partSum.concat(sumRecursively(arr, start)), ++start, end); }; return partSum; }; console.log(partSumRecursively(arr));
출력
두 방법 모두에 대한 콘솔의 출력은 다음과 같습니다. -
[ 41, 31, 26, 20, 8, 1 ]