배열 안에 여러 개의 하위 배열이 있는 데이터 구조를 다뤄야 하는 경우가 자주 있습니다. 이번 글에서는 각 하위 배열이 정확히 두 개의 요소(첫 번째는 문자열, 예를 들어 사람 이름 / 두 번째는 정수)로 구성된 경우, 첫 번째 요소가 같은 하위 배열들을 하나로 병합하고, 두 번째 요소는 해당 항목들의 값을 모두 더한 합계로 만드는 방법을 알아보겠습니다.
문제 정의와 예시 데이터
다음과 같은 예시 배열이 있다고 가정해 보겠습니다.
const example = [ ['first', 12], ['second', 19], ['first', 7] ];
이 배열은 아래와 같이 변환되어야 합니다. 'first'라는 키를 가진 항목들이 하나로 합쳐지고, 그 값은 12 + 7 = 19가 됩니다.
const example = [ ['first', 19], ['second', 19] ];
combineArray() 함수 구현
배열을 입력받아 병합된 배열을 반환하는 함수 combineArray()를 작성해 보겠습니다.
const people = [
['Ram', 21],
['Mohan', 33],
['Vikram', 25],
['Mike', 29],
['Mohan', 41],
['Vikram', 26]
];
const combineArray = (people) => {
const map = {};
for (const index in people) {
const name = people[index][0];
const prop = people[index][1];
if (map[name]) {
map[name] += prop;
} else {
map[name] = prop;
}
}
return Object.keys(map).map(key => [key, map[key]]);
}
console.log(combineArray(people));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ 'Ram', 21 ], [ 'Mohan', 74 ], [ 'Vikram', 51 ], [ 'Mike', 29 ] ]
'Mohan'은 33 + 41 = 74, 'Vikram'은 25 + 26 = 51로 올바르게 합산된 것을 확인할 수 있습니다.
동작 원리 살펴보기
이 함수의 핵심 로직은 다음과 같습니다.
1단계 — 객체를 맵으로 활용: 배열을 순회하면서 이름(name)을 키로, 값(prop)을 밸류로 하는 객체를 생성합니다. 이미 존재하는 키가 나오면 기존 값에 새 값을 더해 누적합니다. 이렇게 하면 중복 키가 자연스럽게 하나로 합쳐집니다.
2단계 — 객체를 배열로 변환: 순회가 끝나면 Object.keys()로 객체의 키 목록을 가져오고, map()을 사용해 각 키-값 쌍을 다시 [키, 값] 형태의 하위 배열로 변환하여 최종 결과를 반환합니다.
시간 및 공간 복잡도
이 함수의 시간 복잡도는 O(2n)으로, 일반적으로 O(n)으로 표기합니다. 공간 복잡도 역시 결과를 저장하는 객체와 배열 때문에 O(n)입니다. 즉, 입력 크기에 비례하는 선형 시간 안에 효율적으로 처리할 수 있습니다.