두 개의 문자열 str1과 str2를 입력받아, 두 번째 문자열이 첫 번째 문자열을 회전시킨 형태인지 판별하는 JavaScript 함수를 작성해야 합니다.
예를 들어, 입력 문자열이 다음과 같다면 −
const str1 = 'abcde';
const str2 = 'cdeab';
str2는 str1의 앞부분에 있던 'ab'를 문자열 끝으로 이동시켜 만든 것이므로, 출력 결과는 true가 되어야 합니다.
알고리즘의 동작 원리
이 문제는 다음 단계로 해결할 수 있습니다.
1. 두 문자열의 길이가 다르면 회전 관계일 수 없으므로 false를 반환합니다.
2. 두 문자열이 모두 빈 문자열이라면 true를 반환합니다.
3. 인덱스 i를 0부터 문자열 길이까지 순회하면서, str1을 i번째 위치에서 잘라 앞부분과 뒷부분의 순서를 바꿔 새로운 문자열을 만듭니다.
4. 만들어진 회전 문자열이 str2와 일치하면 true를 반환하고, 모든 경우를 확인한 후에도 일치하지 않으면 false를 반환합니다.
구현 예제
const str1 = 'abcde';
const str2 = 'cdeab';
const isRotated = (str1, str2) => {
if(str1.length !== str2.length){
return false
};
if( (str1.length || str2.length) === 0){
return true
};
for(let i = 0; i < str1.length; i++){
const reversed = str1.slice(i).concat(str1.slice(0, i));
if(reversed === str2){
return true
};
}
return false;
};
console.log(isRotated(str1, str2));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
true
더 간단한 대안 방법
위의 반복문 방식 외에도, 문자열 회전의 특성을 활용하면 한 줄로 해결할 수 있습니다. str1을 자기 자신과 이어 붙인 문자열에는 str1의 모든 회전 형태가 포함되므로, 다음과 같이 includes() 메서드를 사용하면 됩니다.
const isRotated = (str1, str2) =>
str1.length === str2.length && (str1 + str1).includes(str2);
이 방법은 코드가 훨씬 간결할 뿐만 아니라 가독성도 뛰어나므로, 실무에서는 이 방식을 사용하는 것을 추천합니다.