문자열을 인자로 받아, 원래 문자열에서 두 번 이상 등장한 단어만 모아 새 문자열로 반환하는 JavaScript 함수를 작성해야 합니다. 즉, 한 번만 나타난 단어는 모두 제거하고 반복되는 단어만 남기는 것이 목표입니다.
예시
입력 문자열이 다음과 같다고 가정해 보겠습니다 −
const str = 'this is a is this string that contains that some repeating words';
출력
이 경우 기대되는 출력은 다음과 같습니다 −
const output = 'this is that';
위 예시에서 'this', 'is', 'that'은 각각 두 번 이상 등장했기 때문에 결과에 포함되며, 'a', 'string', 'contains', 'some', 'repeating', 'words'처럼 한 번만 나타난 단어들은 제외됩니다.
구현 접근 방식
이 함수는 다음 단계를 거쳐 구현할 수 있습니다.
split(" ")메서드로 문자열을 공백 기준으로 분리해 단어 배열을 만듭니다.- 배열을 순회하면서
indexOf와lastIndexOf의 반환값이 서로 다른 단어, 즉 두 번 이상 등장한 단어를 찾습니다. includes로 결과 배열에 이미 담긴 단어인지 확인하여, 같은 단어가 여러 번 추가되지 않도록 합니다.- 마지막에
join(" ")으로 결과 배열을 다시 하나의 문자열로 합쳐 반환합니다.
코드 예제
실제 구현 코드는 다음과 같습니다 −
const str = 'this is a is this string that contains that some repeating
words';
const keepDuplicateWords = str => {
const strArr = str.split(" ");
const res = [];
for(let i = 0; i < strArr.length; i++){
if(strArr.indexOf(strArr[i]) !== strArr.lastIndexOf(strArr[i])){
if(!res.includes(strArr[i])){
res.push(strArr[i]);
};
};
};
return res.join(" ");
};
console.log(keepDuplicateWords(str));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
this is that
이 방법은 직관적이고 이해하기 쉽지만, 각 단어마다 indexOf, lastIndexOf, includes를 호출하므로 시간 복잡도가 O(n²)에 가깝습니다. 문자열이 매우 길다면 객체(Map)를 사용해 각 단어의 출현 횟수를 한 번의 순회로 세는 방식이 더 효율적일 수 있습니다.