문제 정의
다음과 같이 여러 숫자가 연속해서 이어진 문자열이 있다고 가정해 보겠습니다.
const str = '11222233344444445666';
이 문자열을 입력받아, 문자열 안에 포함된 각 숫자가 몇 번씩 등장하는지를 나타내는 객체를 반환하는 JavaScript 함수를 작성해야 합니다.
따라서 위 문자열에 대한 기대 출력 결과는 다음과 같습니다.
const output = {
"1": 2,
"2": 4,
"3": 3,
"4": 7,
"5": 1,
"6": 3
};예제 코드
이 문제를 해결하는 코드는 다음과 같습니다.
const str = '11222233344444445666';
const mapString = str => {
const map = {};
for(let i = 0; i < str.length; i++){
map[str[i]] = (map[str[i]] || 0) + 1;
};
return map;
};
console.log(mapString(str));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
{ '1': 2, '2': 4, '3': 3, '4': 7, '5': 1, '6': 3 }코드 동작 원리
핵심 로직은 매우 간단합니다. 함수 mapString은 빈 객체 map을 생성한 뒤, 문자열의 각 문자를 처음부터 끝까지 순회합니다.
순회 과정에서 (map[str[i]] || 0) + 1 패턴을 사용하는데, 이 부분이 핵심입니다. 해당 숫자가 객체에 이미 존재하면 기존 값에 1을 더하고, 아직 존재하지 않으면 undefined 대신 0으로 처리한 뒤 1을 더해 새 키를 생성합니다. 이처럼 논리 OR(||) 연산자를 활용하면 별도의 조건문 없이도 깔끔하게 카운팅 로직을 구현할 수 있습니다.
모든 문자를 순회한 후에는 각 숫자별 등장 횟수가 담긴 객체를 그대로 반환하며, 시간 복잡도는 O(n)으로 문자열 길이에 비례해 선형적으로 동작합니다.