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

JavaScript 문자열에서 n번째 등장하는 부분 문자열을 제거하는 폴리필 만들기

문자열 메서드를 확장하고 싶다면 String.prototype에 폴리필(polyfill)을 추가하는 방법이 유용합니다. 이번 글에서는 문자열에서 특정 부분 문자열이 n번째로 등장했을 때 그 부분을 제거하는 폴리필 함수 removeStr()을 직접 구현해 보겠습니다.

함수 설계

removeStr() 함수는 다음 두 가지 인자를 받습니다.

  • subStr → 문자열에서 찾아서 제거할 부분 문자열
  • num → 몇 번째(num) 등장을 제거할지 지정하는 숫자

동작 규칙은 다음과 같습니다.

  • 부분 문자열이 성공적으로 제거되면 새로운 문자열을 반환합니다.
  • 그 외의 모든 경우(부분 문자열이 아예 없거나, 요청한 횟수만큼 등장하지 않는 경우)에는 -1을 반환합니다.

예를 들어 다음과 같이 사용할 수 있습니다.

const str = 'drsfgdrrtdr';
console.log(str.removeStr('dr', 3));

'dr'은 문자열에 세 번 등장하므로, 세 번째 등장을 제거하면 아래와 같은 결과가 나옵니다.

'drsfgdrrt'

구현 코드

const str = 'drsfgdrrtdr';
const subStr = 'dr';
const num = 2;

function removeStr(subStr, num) {
  // 부분 문자열이 한 번도 등장하지 않으면 즉시 -1 반환
  if (!this.includes(subStr)) {
    return -1;
  }

  let start = 0;
  let end = subStr.length;
  let occurrences = 0;

  // 슬라이딩 윈도우: 윈도우의 끝(end)이 문자열 끝을 넘지 않을 때까지 이동
  for (; end <= this.length; end++, start++) {
    if (this.substring(start, end) === subStr) {
      occurrences++;

      // 요청한 n번째 등장을 찾았다면 해당 구간을 잘라낸 새 문자열 반환
      if (occurrences === num) {
        return this.substring(0, start) + this.substring(end);
      }
    }
  }

  // num번 만큼 등장하지 않는 경우
  return -1;
}

// String.prototype에 추가하여 모든 문자열에서 바로 호출 가능
String.prototype.removeStr = removeStr;

console.log(str.removeStr(subStr, num));

참고: 원본 예제의 반복문에는 종료 조건이 비어 있어, 요청한 횟수만큼 등장하지 않으면 무한 루프에 빠질 수 있습니다. 위 코드에서는 종료 조건(end <= this.length)을 명확히 넣어 안전성을 높였습니다.

실행 결과

콘솔에는 두 번째 'dr'이 제거된 문자열이 출력됩니다.

drsfgrtdr

코드 동작 원리

  • 사전 검증removeStr()은 먼저 this.includes()로 부분 문자열의 존재 여부를 확인하고, 단 한 번도 등장하지 않으면 곧바로 -1을 반환하며 종료합니다.
  • 슬라이딩 윈도우 알고리즘 – 부분 문자열 길이와 같은 크기의 윈도우를 만들어, 각 위치에서 윈도우 내용이 subStr과 일치하는지 비교하며 등장 횟수를 셉니다.
  • 윈도우 이동 – 가장 왼쪽 위치에서 시작해 윈도우의 끝이 원본 문자열의 끝에 도달할 때까지 한 칸씩 오른쪽으로 밀어냅니다.
  • n번째 일치 시 처리 – 탐색 중 등장 횟수가 요청한 num과 같아지면 해당 구간을 문자열에서 잘라내고, 앞부분과 뒷부분을 이어 붙인 새 문자열을 반환합니다.
  • 실패 처리 – 문자열 전체를 탐색했는데도 충분한 등장 횟수가 없다면 -1을 반환하며 함수를 종료합니다.

마지막으로 removeStr 함수를 String.prototype에 추가했기 때문에, 별도의 헬퍼 함수 없이 모든 문자열 인스턴스에서 str.removeStr('dr', 3)처럼 네이티브 메서드처럼 자연스럽게 호출할 수 있습니다.