JavaScript에서 두 개의 문자열을 받아, 첫 번째 문자열(str1) 안에 두 번째 문자열(str2)이 총 몇 번 등장하는지 세어 그 결과를 반환하는 함수를 작성해야 하는 경우가 종종 있습니다.
예를 들어 다음과 같은 동작을 기대할 수 있습니다.
count('this is a string', 'is') → 2 반환구현 예제
아래 코드는 indexOf() 메서드를 활용해 문자열 내 특정 부분 문자열의 등장 횟수를 계산하는 함수입니다. 추가로 allowOverlapping 옵션을 통해 겹치는 패턴도 허용할지 여부를 지정할 수 있습니다.
const str1 = 'this is a string';
const str2 = 'is';
const countOccurrences = (str1, str2, allowOverlapping = true) => {
// 입력값이 문자열이 아니더라도 안전하게 처리하도록 변환
str1 += "";
str2 += "";
// 검색할 문자열이 비어 있다면 가능한 위치 개수만큼 반환
if (str2.length <= 0) return (str1.length + 1);
let n = 0; // 발견된 횟수
let pos = 0; // 현재 검색 시작 위치
const step = allowOverlapping ? 1 : str2.length;
while (true) {
pos = str1.indexOf(str2, pos);
if (pos >= 0) {
++n;
pos += step;
} else break;
}
return n;
};
console.log(countOccurrences(str1, str2));코드 동작 원리
- indexOf(str2, pos):
pos위치부터 검색을 시작해str2가 처음 나타나는 인덱스를 반환합니다. 찾지 못하면-1을 반환합니다. - step 값: 기본적으로
1>씩 이동하기 때문에 겹치는 패턴(예:'aaa'에서'aa'찾기)도 모두 계산합니다.allowOverlapping을false로 설정하면str2길이만큼 건너뛰어 겹치지 않는 매칭만 셉니다. - 반복 종료 조건: 더 이상 일치하는 문자열을 찾지 못해
indexOf가-1을 반환하면 루프가 종료됩니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
2
'this is a string'이라는 문장에는 'is'가 정확히 2번 포함되어 있으므로 결과값으로 2가 출력되는 것을 확인할 수 있습니다.