문제 소개
이번 포스팅에서는 JavaScript로 문자열이 특정 패턴의 반복으로 이루어져 있는지 판별하는 함수를 작성해 보겠습니다.
함수는 첫 번째이자 유일한 인자로 문자열 하나를 받으며, 해당 문자열이 동일한 문자열 조각이 여러 번 이어져 만들어진 것인지 확인해야 합니다.
만약 어떤 부분 문자열이 반복되어 전체 문자열을 구성하고 있다면 true를, 그렇지 않다면 false를 반환하면 됩니다.
예를 들어 입력 문자열이 다음과 같다고 가정해 보겠습니다.
const str = 'carcarcarcar';
이 경우 기대되는 출력 결과는 다음과 같습니다.
const output = true;
'car'라는 문자열이 네 번 반복되어 전체 문자열을 이루고 있기 때문입니다. 반대로 'abcdef'처럼 반복 패턴이 없는 문자열이라면 false가 반환됩니다.
구현 코드
다음은 위 로직을 구현한 코드입니다.
const str = 'carcarcarcar';
const isRepeating = (str = '') => {
if (!str.length){
return false
};
for(let j = 1; (j <= str.length / 2); j++){
if (str.length % j != 0){
continue
};
let flag = true;
for(let i = j; i < str.length; ++ i){
if(str[i] != str[i - j]){
flag = false;
break;
};
};
if(flag){
return true;
};
};
return false;
};
console.log(isRepeating(str));코드 동작 원리
- 반복 단위가 될 수 있는 길이 j를 1부터 문자열 길이의 절반까지 순회합니다. 반복 패턴의 최대 길이는 전체 길이의 절반이므로 그 이상은 검사할 필요가 없습니다.
- j가 문자열 전체 길이를 나누어 떨어뜨리지 못하면 해당 길이로는 문자열을 완전히 채울 수 없으므로 건너뜁니다.
- 각 인덱스 i의 문자와 j칸 앞의 문자(i - j)를 비교하여 모든 위치에서 일치하는지 확인합니다.
- 모든 비교가 통과하면 해당 패턴이 반복된다는 뜻이므로 즉시 true를 반환합니다.
- 모든 후보 길이를 검사했는데도 일치하는 패턴이 없다면 false를 반환합니다.
또한 빈 문자열이 입력될 경우 반복 패턴이 존재할 수 없으므로 처음에 false를 반환하도록 처리했습니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
true
'carcarcarcar'는 'car'가 4번 반복된 문자열이므로 true가 출력되는 것을 확인할 수 있습니다.