이번 글에서는 문자열을 첫 번째이자 유일한 인수로 받아, 해당 문자열에 포함된 고유한 문자들을 키로 하고 각 키의 값을 0으로 초기화한 객체를 생성하는 함수를 작성해 보겠습니다.
문제 정의
예를 들어 입력 문자열이 다음과 같다고 가정해 봅시다.
const str = 'hello world!';
기대 출력 결과
위 문자열을 함수에 전달하면 다음과 같은 객체가 반환되어야 합니다.
const obj = { "h": 0, "e": 0, "l": 0, "o": 0, " ": 0, "w": 0, "r": 0, "d": 0, "!": 0 };여기서 주목할 점은 중복된 문자(예: 'l'이 세 번 등장)가 있더라도 객체의 키는 한 번만 존재한다는 것입니다. 공백이나 특수문자도 하나의 문자로 취급됩니다.
구현 방법
이 문제는 split()과 reduce() 메서드를 조합하면 아주 간결하게 해결할 수 있습니다. 문자열을 개별 문자 배열로 분리한 뒤, reduce를 통해 빈 객체에 각 문자를 키로 추가하면서 값을 0으로 설정하는 방식입니다.
const str = 'hello world!';
const stringToObject = str => {
return str.split("").reduce((acc, val) => {
acc[val] = 0;
return acc;
}, {});
};
console.log(stringToObject(str));
console.log(stringToObject('is it an object'));코드 동작 원리
str.split("")는 문자열을 한 글자씩 나눈 배열을 반환합니다. 이후 reduce()가 배열의 각 문자를 순회하면서 누적 객체(acc)에 해당 문자를 키로 추가하고 값을 0으로 할당합니다. 최종적으로 완성된 객체가 반환됩니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
{ h: 0, e: 0, l: 0, o: 0, ' ': 0, w: 0, r: 0, d: 0, '!': 0 }
{ i: 0, s: 0, ' ': 0, t: 0, a: 0, n: 0, o: 0, b: 0, j: 0, e: 0, c: 0 }추가 팁: Set을 활용한 대안
ES6의 Set을 사용하면 중복 제거 과정을 더 명확하게 표현할 수도 있습니다.
const stringToObjectWithSet = str => {
return Object.fromEntries([...new Set(str)].map(ch => [ch, 0]));
};Set은 자동으로 중복을 제거해 주므로, 고유 문자만 남긴 후 Object.fromEntries()로 객체를 만드는 방식입니다. 두 방법 모두 시간 복잡도는 O(n)으로 효율적이며, 상황에 맞게 선택하여 사용하면 됩니다.