문제 개요
숫자로 이루어진 배열을 입력받아, 같은 값이 여러 번 등장할 경우 이를 하나의 인덱스에 모두 더해 합산하는 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 ]이 방식은 첫 등장 순서를 유지하면서 합산 결과를 새로운 배열로 반환하므로, 원본 데이터를 보존해야 하는 경우에 유용합니다.