문제 개요
이번 글에서는 String.prototype 객체에 추가할 removeStr() 함수를 작성해 보겠습니다. 이 함수는 다음 세 가지 인자를 받습니다.
- str: 대상이 되는 원본 문자열
- char(subStr): 제거하고자 하는 문자 또는 부분 문자열
- n(num): 몇 번째로 등장하는 항목을 제거할지 지정하는 숫자
즉, 이 함수는 문자열에서 n번째로 나타나는 특정 문자(또는 부분 문자열)를 찾아 제거한 새로운 문자열을 반환해야 합니다. 만약 해당 문자가 존재하지 않거나 n번째 등장 횟수가 없다면 -1을 반환하도록 처리합니다.
구현 코드
const str = 'aaaaaa';
const subStr = 'a';
const num = 6;
removeStr = function(subStr, num){
if(!this.includes(subStr)){
return -1;
}
let start = 0, end = subStr.length;
let occurences = 0;
for(; ;end < this.length){
if(this.substring(start, end) === subStr){
occurences++;
};
if(occurences === num){
return this.substring(0, start) + this.substring(end, this.length);
};
end++;
start++;
}
return -1;
}
String.prototype.removeStr = removeStr;
console.log(str.removeStr(subStr, num));코드 동작 방식
코드의 흐름을 단계별로 살펴보면 다음과 같습니다.
- 존재 여부 확인:
this.includes(subStr)를 통해 대상 문자가 문자열에 포함되어 있는지 먼저 검사합니다. 포함되어 있지 않으면 즉시-1을 반환합니다. - 슬라이딩 윈도우 방식 탐색:
start와end두 인덱스를 사용해 부분 문자열 길이만큼의 범위를 한 칸씩 이동하며 비교합니다. - 등장 횟수 카운트: 현재 범위의 부분 문자열이
subStr과 일치하면occurences값을 1씩 증가시킵니다. - n번째 일치 시 제거: 등장 횟수가 목표 값
num에 도달하면, 해당 위치 앞부분(substring(0, start))과 뒷부분(substring(end))을 연결하여 새 문자열을 만들어 반환합니다.
여기서 핵심은 문자열을 직접 수정하지 않고, 잘라낸 두 조각을 이어 붙인 새로운 문자열을 생성한다는 점입니다. 자바스크립트의 문자열은 불변(immutable)하기 때문에 이러한 방식이 안전하고 관례에도 맞습니다.
실행 결과
위 예제에서는 문자열 'aaaaaa'에서 6번째로 등장하는 'a'를 제거하므로, 콘솔에는 아래와 같은 결과가 출력됩니다.
aaaaa
이처럼 removeStr() 함수를 활용하면 단순히 첫 번째나 마지막 항목이 아니라, 원하는 순번의 특정 문자만 정확하게 제거할 수 있습니다. 필요에 따라 -1 대신 원본 문자열을 그대로 반환하거나, 에러 메시지를 던지는 방식으로 응용할 수도 있습니다.