문제 상황
하나의 문자열과 문자열 배열이 주어졌을 때, 배열에 포함된 모든 단어를 원본 문자열에서 제거하는 함수를 작성해야 합니다.
여기서 제거 대상은 완전한 단어이므로, 단어를 삭제한 후 남는 앞뒤 공백도 함께 정리하여 두 개 이상의 공백이 연속으로 나타나지 않도록 처리해야 합니다.
그럼 이 기능을 구현하는 코드를 작성해 보겠습니다.
구현 예시
const string = "The weather in Delhi today is very similar to the weather in Mumbai";
const words = [
'shimla','rain','weather','Mumbai','Pune','Delhi','tomorrow','today','yesterday'
];
const removeWords = (str, arr) => {
return arr.reduce((acc, val) => {
const regex = new RegExp(` ${val}`, "g");
return acc.replace(regex, '');
}, str);
};
console.log(removeWords(string, words));코드 설명
위 코드의 핵심은 reduce() 메서드와 정규표현식의 조합입니다.
- reduce(): 배열의 각 요소(제거할 단어)를 순회하면서 누적 결과값(acc)에 해당 단어 제거 작업을 반복 적용합니다. 초기값은 원본 문자열입니다.
- 정규표현식: 각 단어 앞에 공백(` `)을 붙여 패턴을 만듭니다. 이렇게 하면 'weather'라는 단어가 'sunny weather'처럼 독립된 단어일 때만 제거되고, 다른 단어의 일부로 포함된 경우에는 제거되지 않아 안전합니다.
- replace(regex, ''): 일치하는 부분을 빈 문자열로 교체하여 단어와 그 앞의 공백을 한 번에 제거합니다.
이 방식은 단어 앞의 공백까지 함께 제거하기 때문에, 여러 단어를 삭제한 뒤에도 불필요한 연속 공백이 생기지 않습니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
The in is very similar to the in
'weather', 'Delhi', 'today', 'Mumbai' 등 배열에 포함된 단어들이 모두 제거되고, 남은 단어들이 자연스럽게 정리된 것을 확인할 수 있습니다.
마무리
이 접근 방식은 코드가 간결할 뿐만 아니라, reduce와 정규표현식을 활용해 가독성도 뛰어납니다. 다만 대량의 데이터를 처리할 경우 각 단어마다 정규표현식 객체를 새로 생성하는 비용이 발생할 수 있으니, 성능이 중요한 환경에서는 패턴을 미리 조합한 하나의 정규표현식으로 최적화하는 방법도 고려해 볼 수 있습니다.