이번 글에서는 문자열을 입력받아 두 번 이상 등장하는 첫 번째 문자의 인덱스를 반환하는 JavaScript 함수를 작성해 보겠습니다. 만약 반복되는 문자가 존재하지 않는다면 -1을 반환하도록 구현합니다.
문제 정의
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
const str = 'Hello world, how are you';
이 문자열에서 가장 먼저 반복해서 나타나는 문자의 인덱스를 찾아야 합니다.
해결 방법
가장 효율적인 접근 방식은 Map 객체를 활용하는 것입니다. 문자열을 왼쪽부터 오른쪽으로 한 글자씩 순회하면서, 각 문자와 해당 인덱스를 Map에 저장합니다. 순회 중에 이미 Map에 존재하는 문자를 만나면, 그 문자가 처음 등장했던 인덱스를 즉시 반환하면 됩니다.
이 방식은 문자열을 한 번만 순회하므로 시간 복잡도가 O(n)으로 매우 효율적입니다.
예제 코드
const str = 'Hello world, how are you';
const firstRepeating = str => {
const map = new Map();
for(let i = 0; i < str.length; i++){
if(map.has(str[i])){
return map.get(str[i]);
};
map.set(str[i], i);
};
return -1;
};
console.log(firstRepeating(str));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
2
결과 분석
문자열 'Hello world, how are you'에서 인덱스 0의 문자는 'H', 인덱스 1은 'e', 그리고 인덱스 2는 'l'입니다. 바로 그다음 인덱스 3에서도 'l'이 등장하기 때문에, 처음 반복되는 문자인 'l'이 최초로 나타난 인덱스 2가 반환됩니다.
마무리
Map을 사용한 이 방법은 대소문자를 구분한다는 점에 유의하세요. 만약 대소문자를 구분하지 않고 싶다면, 순회 전에 str.toLowerCase()를 적용하면 됩니다. 또한 반복 문자가 없는 경우 -1을 반환하도록 처리했기 때문에, 다양한 입력 상황에서도 안전하게 동작합니다.