Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 문자열 속 숫자별 등장 횟수 세기 — 고유 id와 개수를 객체로 저장하는 방법

문제 정의

다음과 같이 하나의 숫자를 나타내는 긴 문자열이 있다고 가정해 보겠습니다.

const str = '11222233344444445666';

이 문자열을 입력으로 받아 처리하는 JavaScript 함수를 작성해야 합니다. 함수는 객체(object)를 반환해야 하며, 이 객체는 다음 두 가지 역할을 수행합니다.

  • 문자열에 등장하는 각 고유 숫자마다 고유한 id 속성을 부여합니다.
  • 해당 숫자가 문자열에 몇 번 나타나는지 그 횟수를 displayed 속성에 저장합니다.

따라서 위 문자열에 대한 최종 출력 결과는 다음과 같은 형태가 됩니다.

const output = {
    '1': { id: '1', displayed: 2 },
    '2': { id: '2', displayed: 4 },
    '3': { id: '3', displayed: 3 },
    '4': { id: '4', displayed: 7 },
    '5': { id: '5', displayed: 1 },
    '6': { id: '6', displayed: 3 }
};

구현 예제

이 문제는 문자열을 한 번만 순회하면서 각 문자의 등장 여부를 확인하는 방식으로 해결할 수 있습니다. 전체 코드는 다음과 같습니다.

const str = '11222233344444445666';
const countNumberFrequency = str => {
    const map = {};
    for(let i = 0; i < str.length; i++){
        const el = str[i];
        if(map.hasOwnProperty(el)){
            map[el]['displayed']++;
        }else{
            map[el] = {
                id: el,
                displayed: 1
            };
        };
    };
    return map;
};
console.log(countNumberFrequency(str));

코드 동작 원리

  1. 결과를 담을 빈 객체 map을 생성합니다.
  2. for 반복문으로 문자열의 각 문자를 처음부터 끝까지 순회합니다.
  3. hasOwnProperty() 메서드로 현재 문자가 이미 map에 존재하는지 확인합니다.
  4. 이미 존재한다면 해당 항목의 displayed 값을 1 증가시키고, 존재하지 않는다면 iddisplayed: 1을 가진 새 객체를 생성합니다.
  5. 순회가 끝나면 완성된 map 객체를 반환합니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

{
    '1': { id: '1', displayed: 2 },
    '2': { id: '2', displayed: 4 },
    '3': { id: '3', displayed: 3 },
    '4': { id: '4', displayed: 7 },
    '5': { id: '5', displayed: 1 },
    '6': { id: '6', displayed: 3 }
}

출력 결과에서 볼 수 있듯이, 숫자 4는 문자열에 7번 등장하여 displayed: 7로 기록되었고, 한 번만 등장한 숫자 5displayed: 1로 기록된 것을 확인할 수 있습니다.

마무리

이 접근 방식은 시간 복잡도 O(n)으로 문자열 길이에 비례해 선형적으로 동작하기 때문에 매우 효율적입니다. 참고로 ES6 환경이라면 Object.prototype.hasOwnProperty.call() 대신 Map 자료구조나 reduce() 메서드를 활용해 더욱 간결하게 작성할 수도 있습니다. 문자 빈도수 집계는 로그 분석, 데이터 정제, 통계 처리 등 다양한 실무 상황에서 자주 활용되는 기본 패턴이므로 꼭 익혀두시기 바랍니다.