두 개의 객체를 입력받아 하나의 객체로 병합하고, 동일한 키를 가진 값들은 서로 더하는 함수를 작성해야 합니다. 이때 선형 시간(O(n))과 상수 공간 안에서 처리해야 하며, 이는 최대 한 번의 루프만 사용하고 기존 객체의 속성을 그대로 활용하여 새로운 변수나 객체를 추가로 생성하지 않는다는 의미입니다.
접근 방식
핵심 아이디어는 간단합니다. 첫 번째 객체(obj1)의 모든 키를 순회하면서, 두 번째 객체(obj2)에 같은 키가 존재하는지 확인합니다. 존재한다면 obj1의 해당 값에 obj2의 값을 누적해서 더해줍니다. 이렇게 하면 별도의 새 객체를 만들지 않고 기존 객체 자체에서 병합이 이루어지므로, 시간 복잡도 O(n), 공간 복잡도 O(1)를 만족할 수 있습니다.
예제 코드
const obj1 = {
value1: 45,
value2: 33,
value3: 41,
value4: 4,
value5: 65,
value6: 5,
value7: 15,
};
const obj2 = {
value1: 34,
value3: 71,
value5: 17,
value7: 1,
value9: 9,
value11: 11,
};
const mergeObjects = (obj1, obj2) => {
for(key in obj1){
if(obj2[key]){
obj1[key] += obj2[key];
};
};
return;
};
mergeObjects(obj1, obj2);
console.log(obj1);
출력 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다 −
{
value1: 79,
value2: 33,
value3: 112,
value4: 4,
value5: 82,
value6: 5,
value7: 16
}
코드 설명
for...in 루프를 사용해 obj1의 각 키를 하나씩 순회합니다. 루프 내부에서는 obj2[key]가 존재하는지(truthy한 값인지) 확인한 뒤, 존재하면 obj1의 해당 키 값에 obj2의 값을 더합니다.
그 결과 value1은 45 + 34 = 79, value3은 41 + 71 = 112처럼 동일한 키의 값들이 합산됩니다. 반면 obj2에만 존재하는 value9, value11 같은 키는 obj1을 기준으로 순회하기 때문에 최종 결과에 포함되지 않습니다.
참고 사항
위 코드에서는 if(obj2[key]) 조건으로 키의 존재 여부를 검사하므로, 값이 0이거나 falsy한 경우에는 병합되지 않는다는 점에 유의해야 합니다. 보다 엄격하게 키 존재 여부를 확인하려면 key in obj2 또는 Object.prototype.hasOwnProperty.call(obj2, key)를 사용하는 것이 좋습니다.