문제 소개
이번 글에서는 문자열을 입력받아 각 문자를 0부터 시작하는 숫자로 매핑하는 JavaScript 함수를 작성해 보겠습니다.
요구 사항은 다음과 같습니다.
- 함수는 문자열을 인수로 받습니다.
- 문자열의 각 문자를 처음 만나면(고유 문자) 매핑 카운트를 1 증가시켜 새로운 번호를 할당합니다.
- 이미 등장했던(중복된) 문자를 만나면 새 번호 대신 기존에 할당된 동일한 번호를 매핑합니다.
예시
입력 문자열이 다음과 같다고 가정해 보겠습니다.
const str = 'heeeyyyy';
'h'는 첫 등장이므로 0, 'e'는 세 번 반복되므로 모두 1, 'y'는 네 번 반복되므로 모두 2를 받습니다. 따라서 기대되는 출력은 다음과 같습니다.
const output = [0, 1, 1, 1, 2, 2, 2, 2];
구현 코드
다음은 위 로직을 구현한 코드입니다.
const str = 'heeeyyyy';
const mapString = str => {
const res = [];
let curr = '', count = -1;
for(let i = 0; i < str.length; i++){
if(str[i] === curr){
res.push(count);
}else{
count++;
res.push(count);
curr = str[i];
};
};
return res;
};
console.log(mapString(str));코드 동작 원리
- curr: 직전에 매핑한 문자를 저장하는 변수입니다.
- count: 마지막으로 할당된 매핑 번호입니다. 초기값을 -1로 두어 첫 번째 새로운 문자가 등장할 때 0이 되도록 합니다.
- 반복문 안에서 현재 문자가 curr와 같으면 기존 count 값을 그대로 결과 배열에 추가하고, 다르면 count를 1 증가시킨 뒤 새 번호를 추가하고 curr를 현재 문자로 갱신합니다.
실행 결과
위 코드를 콘솔에서 실행하면 다음과 같은 출력을 확인할 수 있습니다.
[ 0, 1, 1, 1, 2, 2, 2, 2 ]
결과 배열에서 'h'는 0, 'eee'는 모두 1, 'yyyy'는 모두 2로 매핑되어 요구 사항을 정확히 충족하는 것을 볼 수 있습니다. 이 방식은 시간 복잡도 O(n)으로 문자열을 한 번만 순회하며 처리하므로 효율적입니다.