문제 정의
문자열 str을 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 입력 문자열 전체를 검사한 뒤, 단 한 번만 등장하는 고유 문자만 원래 순서대로 모아 새로운 문자열을 구성해야 하며, 두 번 이상 나타나는 모든 중복 문자는 결과에서 완전히 제거되어야 합니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다 −
const str = 'hey there i am using javascript';
const removeAllDuplicates = (str = '') => {
let res = '';
for (let i = 0; i < str.length; i++) {
const el = str[i];
// 처음 등장한 위치와 마지막 등장 위치가 같으면 고유 문자
if (str.indexOf(el) === str.lastIndexOf(el)) {
res += el;
}
}
return res;
};
console.log(removeAllDuplicates(str));
코드 동작 원리
- 결과 버퍼 초기화: 최종 결과를 담을 빈 문자열
res를 준비합니다. - 한 글자씩 순회:
for반복문으로 입력 문자열의 모든 문자를 차례대로 확인합니다. - 고유 여부 판별:
indexOf()는 해당 문자가 처음 발견되는 인덱스를,lastIndexOf()는 마지막으로 발견되는 인덱스를 반환합니다. 두 값이 같다면 그 문자가 문자열에 딱 한 번만 존재한다는 의미이므로, 이 경우에만 결과에 추가합니다. - 결과 반환: 순회가 끝나면 고유 문자만 모인 새로운 문자열을 반환합니다.
출력 결과
콘솔에는 다음과 같이 출력됩니다 −
ymungjvcp
보너스: filter()로 더 간결하게 작성하기
동일한 로직을 filter() 메서드를 활용하면 한 줄로 표현할 수 있습니다.
const removeAllDuplicates = (str = '') =>
[...str].filter(el => str.indexOf(el) === str.lastIndexOf(el)).join('');
두 방식 모두 각 문자마다 문자열을 다시 탐색하므로 시간 복잡도는 O(n²)입니다. 입력 문자열이 매우 길다면 Map 객체로 각 문자의 등장 횟수를 미리 집계하여 O(n) 성능으로 최적화할 수 있습니다.