이번 글에서는 문자열을 입력받아 해당 문자열에서 가장 먼저 두 번 나타나는 문자의 인덱스를 반환하는 JavaScript 함수를 작성하는 방법을 알아보겠습니다.
만약 두 번 이상 나타나는 문자가 하나도 없다면 함수는 -1을 반환해야 합니다.
접근 방법
이 문제는 Map 객체를 활용하면 효율적으로 해결할 수 있습니다. 문자열을 왼쪽에서 오른쪽으로 순회하면서 각 문자와 해당 인덱스를 Map에 저장합니다. 순회 도중 이미 Map에 존재하는 문자를 만나면, 그 문자가 처음 등장했을 때의 인덱스를 즉시 반환하면 됩니다.
이 방식은 시간 복잡도 O(n), 공간 복잡도 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));코드 설명
위 코드의 동작 과정을 단계별로 살펴보겠습니다.
먼저 빈 Map 객체를 생성합니다. 그리고 for 루프를 사용해 문자열의 각 문자를 순서대로 확인합니다. 현재 문자가 Map에 이미 존재한다면, 이는 해당 문자가 두 번째로 등장했다는 의미이므로 Map에 저장되어 있던 첫 번째 인덱스를 반환합니다.
존재하지 않는다면 현재 문자와 인덱스를 Map에 저장하고 다음 문자로 넘어갑니다. 모든 문자를 확인한 후에도 중복된 문자가 없다면 최종적으로 -1을 반환합니다.
예제 문자열 'Hello world, how are you'의 경우, 인덱스 0의 'H'와 인덱스 4의 'o'는 각각 처음 등장하므로 Map에 저장됩니다. 그다음 인덱스 2의 'l'은 이후 인덱스 3에서 다시 등장하므로, 결과적으로 2가 반환됩니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2