Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript – 문자열에서 n번째 부분 문자열을 제거하는 함수 만들기

문제 정의

세 개의 인자를 받는 String.prototype 함수를 작성해야 한다고 가정해 보겠습니다.

  • 첫 번째 인자: 부분 문자열을 검색할 대상 문자열
  • 두 번째 인자: 문자열에서 제거하고 싶은 부분 문자열(subStr)
  • 세 번째 인자: 숫자 n — 몇 번째 출현(occurrence)을 제거할지 지정

제거에 성공하면 새로운 문자열을 반환하고, 어떤 이유로든 제거에 실패하면 -1을 반환해야 합니다.

예제 코드

const str = 'jkdsttjkdsre';
const subStr = 'jk';
const num = 2;

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++;
    }
}

String.prototype.removeStr = removeStr;
console.log(str.removeStr(subStr, num));

코드 동작 원리

이 함수는 먼저 subStr이 문자열에 한 번이라도 존재하는지 확인합니다. 단 한 번도 등장하지 않는다면 즉시 -1을 반환하고 종료합니다.

그다음 슬라이딩 윈도우(Sliding Window) 알고리즘을 사용해 문자열 안에서 subStr이 몇 번 등장하는지 기록합니다. 이때 윈도우의 크기는 subStr의 길이와 같습니다.

가장 왼쪽에 있는 윈도우부터 시작하여, 윈도우의 끝이 원본 문자열의 끝에 도달할 때까지 한 칸씩 밀어 나갑니다. 진행 과정에서 출현 횟수가 요구된 n번째에 도달하면 해당 구간을 문자열에서 잘라낸 뒤 새로 만들어진 문자열을 반환합니다.

만약 문자열 전체를 끝까지 순회했는데도 충분한 출현이 발견되지 않았다면, subStr이 문자열에 n번 등장하지 않는다는 의미이므로 -1을 반환하고 함수를 종료합니다.

마지막으로 removeStr 속성을 String.prototype에 추가함으로써, 모든 문자열에서 일반 메서드처럼 자유롭게 호출할 수 있게 됩니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

jkdsttdsre