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

JavaScript로 배열 내 동일한 숫자 요소 합산하기

문제 개요

숫자로 이루어진 배열을 입력받아, 같은 값이 여러 번 등장할 경우 이를 하나의 인덱스에 모두 더해 합산하는 JavaScript 함수를 작성해야 합니다. 즉, 중복된 숫자들을 하나로 병합하여 각 고유 숫자의 총합을 구하는 것이 목표입니다.

예를 들어 입력 배열이 다음과 같다면 −

const arr = [20, 10, 15, 20, 15, 10];

출력 결과는 다음과 같아야 합니다 −

const output = [40, 20, 30];

20이 두 번 등장하므로 40으로, 10은 두 번 더해져 20으로, 15 역시 두 번 더해져 30으로 합쳐진 것을 확인할 수 있습니다.

해결 방법

배열을 순회하면서 현재 요소와 같은 값을 가진 마지막 인덱스를 lastIndexOf()로 찾고, splice()로 해당 요소를 제거하면서 그 값을 현재 위치에 누적하는 방식으로 문제를 해결할 수 있습니다.

예제 코드

const arr = [20, 10, 15, 20, 15, 10];
const addSimilar = arr => {
   for(let i = 0; i < arr.length; i++){
      while(i !== arr.lastIndexOf(arr[i])){
         const ind = arr.lastIndexOf(arr[i]);
         arr[i] += arr.splice(ind, 1)[0];
      };
   };
};
addSimilar(arr);
console.log(arr);

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다 −

[ 40, 20, 30 ]

코드 설명

for 루프: 배열의 각 요소를 처음부터 끝까지 순회합니다.
while 조건: arr.lastIndexOf(arr[i])가 현재 인덱스 i와 다르다면, 같은 값이 배열 뒤쪽에 아직 남아 있다는 의미입니다.
splice(ind, 1): 뒤쪽에 있는 동일한 값을 제거하고, 제거된 값을 반환받아 현재 위치의 요소에 더합니다.
• 같은 값이 모두 하나로 합쳐질 때까지 while 루프가 반복되며, 최종적으로 중복 없이 합산된 배열이 완성됩니다.

대안: 객체를 활용한 방식

원본 배열을 변경하지 않고 싶다면, 각 숫자의 합계를 객체에 누적한 뒤 값만 추출하는 방법도 사용할 수 있습니다.

const addSimilar = arr => {
   const map = {};
   arr.forEach(num => {
      map[num] = (map[num] || 0) + num;
   });
   return Object.values(map);
};
console.log(addSimilar([20, 10, 15, 20, 15, 10])); // [ 40, 20, 30 ]

이 방식은 첫 등장 순서를 유지하면서 합산 결과를 새로운 배열로 반환하므로, 원본 데이터를 보존해야 하는 경우에 유용합니다.