문제 소개
문자가 두 개씩 짝지어져 있는 특수한 형태의 문자열이 있다고 가정해 보겠습니다.
const str = "AABBCCDDEE";
이 문자열을 기반으로 아래와 같은 구조의 객체를 만들어야 합니다.
const obj = {
code: "AA",
sub: {
code: "BB",
sub: {
code: "CC",
sub: {
code: "DD",
sub: {
code: "EE",
sub: {}
}
}
}
}
};접근 방식
문자열에서 두 글자씩 잘라낼 때마다 새로운 sub 객체가 생성되고, 각 레벨의 code 속성은 해당 위치의 두 글자를 담게 됩니다.
이 문제는 재귀(recursion)로도 해결할 수 있지만, 실제로는 참조(reference) 변수를 활용한 반복문 방식이 더 직관적입니다. 핵심 아이디어는 다음과 같습니다.
- 결과 객체를 담을 변수
res와, 현재 작업 위치를 가리키는 참조 변수ref를 선언합니다. - 문자열이 남아 있는 동안 앞의 두 글자를 잘라내어
ref.code에 할당하고, 빈sub객체를 만든 뒤ref를 그 하위 객체로 이동시킵니다. - 이 과정을 반복하면 자동으로 깊은 중첩 구조가 완성됩니다.
예제 코드
전체 코드는 다음과 같습니다.
const str = "AABBCCDDEE";
const constructObject = str => {
const res = {};
let ref = res;
while(str){
const words = str.substring(0, 2);
str = str.substr(2, str.length);
ref.code = words;
ref.sub = {};
ref = ref.sub;
};
return res;
};
console.log(JSON.stringify(constructObject(str), undefined, 4));
코드 설명
여기서 주목할 부분은 ref = ref.sub; 라인입니다. ref는 단순히 값을 복사하는 것이 아니라 객체 자체를 참조하기 때문에, ref.sub로 이동하면 다음 반복에서 ref.code와 ref.sub에 값을 할당하는 것이 곧 실제 중첩 객체 내부에 값을 쓰는 것이 됩니다. 덕분에 재귀 함수 없이도 원하는 깊이만큼 객체를 계속 확장해 나갈 수 있습니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
{
"code": "AA",
"sub": {
"code": "BB",
"sub": {
"code": "CC",
"sub": {
"code": "DD",
"sub": {
"code": "EE",
"sub": {}
}
}
}
}
}마무리
참조 변수를 활용하면 재귀 호출의 스택 오버플로우 걱정 없이도 임의의 길이를 가진 문자열을 안전하게 중첩 객체 구조로 변환할 수 있습니다. 트리 구조 생성, 카테고리 분류 데이터 변환 등 다양한 상황에서 응용할 수 있는 유용한 패턴이니 꼭 기억해 두시기 바랍니다.