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

JavaScript로 반복 문자 개수 세기: 문자열 압축 방법

문자열을 다루다 보면 각 문자가 몇 번 반복되는지 세어야 하는 경우가 종종 있습니다. 이번 글에서는 문자열 내 연속된 문자의 개수를 세어 '개수+문자' 형태로 변환하는 JavaScript 함수를 만들어 보겠습니다.

문제 정의

예를 들어, 다음과 같은 문자열이 있다고 가정해 봅시다.

const str = 'aabbcde';

이 문자열에는 a가 2개, b가 2개, c·d·e가 각각 1개씩 포함되어 있습니다.

우리는 이러한 문자열을 입력받아, 각 문자의 등장 횟수를 문자 앞에 붙인 새로운 문자열을 생성하는 JavaScript 함수를 작성해야 합니다.

따라서 위 문자열에 대한 출력 결과는 다음과 같아야 합니다.

const output = '2a2b1c1d1e';

해결 방법

핵심 아이디어는 다음과 같습니다.

  1. 문자열을 한 글자씩 분리한 뒤 정렬하여 같은 문자끼리 인접하도록 만듭니다.
  2. 배열을 순회하면서 이전 문자와 현재 문자를 비교합니다.
  3. 같으면 카운트를 증가시키고, 다르면 지금까지의 카운트와 문자를 결과 문자열에 추가한 후 카운트를 초기화합니다.

코드 예시

const str = 'aabbcde';
const repeatLetter = (str = '') => {
    const strArr = str.split("").sort();
    let count = 1;
    let i = 1;
    let res = '';
    while (i < strArr.length) {
        if (strArr[i - 1] === strArr[i]) { count++; }
        else {
            res += count + strArr[i - 1];
            count = 1;
        };
        i++;
    };
    res += count + strArr[i - 1];
    return res;
};
console.log(repeatLetter(str));

동작 원리 살펴보기

  • str.split("")은 문자열을 개별 문자 배열로 분리하고, sort()는 알파벳 순으로 정렬하여 같은 문자를 연속적으로 배치합니다.
  • while 루프에서 현재 문자와 이전 문자를 비교하여 연속 여부를 판단합니다.
  • 마지막 문자 그룹은 루프 종료 후 별도로 처리되므로, res += count + strArr[i - 1]; 코드가 필요합니다.

실행 결과

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

2a2b1c1d1e

참고 사항

이 방식은 Run-Length Encoding(RLE, 런길이 부호화)과 유사한 기법으로, 데이터 압축의 기본 개념이기도 합니다. 다만 이 구현은 정렬을 사용하기 때문에 원본 문자열의 순서가 유지되지 않는다는 점에 유의하세요. 만약 원래 순서대로 연속된 문자만 묶고 싶다면 sort() 단계를 제거하면 됩니다. 예를 들어 'aabbcde'처럼 이미 같은 문자가 인접해 있는 경우에는 정렬 없이도 동일한 결과를 얻을 수 있습니다.