이번 글에서는 C++을 사용해 주어진 문자열이 두 개의 서로 다른 문자가 번갈아 나타나는 형태인지 확인하는 방법을 살펴보겠습니다.
예를 들어 XYXYXY처럼 X와 Y가 교대로 반복되는 문자열은 유효한(valid) 문자열입니다. 반면 ABCD처럼 세 개 이상의 서로 다른 문자가 사용되었거나 같은 문자가 연속으로 등장하는 경우에는 유효하지 않은(invalid) 문자열로 판단합니다.
접근 방법
해결 방법은 매우 간단합니다. 문자열의 모든 위치에 대해 i번째 문자와 i+2번째 문자가 동일한지 검사하면 됩니다.
교대 패턴을 만족하는 문자열이라면 짝수 인덱스끼리는 항상 같은 문자이고, 홀수 인덱스끼리도 항상 같은 문자여야 하기 때문입니다. 검사 도중 한 곳이라도 두 문자가 다르면 즉시 false를 반환하고, 모든 검사를 통과한 후에는 첫 번째 문자와 두 번째 문자가 서로 다른지(즉, 실제로 두 종류의 문자가 교대하는지)까지 확인하여 true 또는 false를 반환합니다.
예제 코드
#include <iostream>
using namespace std;
bool hasAlternateChars(string str) {
for (int i = 0; i < str.length() - 2; i++) {
if (str[i] != str[i + 2]) {
return false;
}
}
if (str[0] == str[1])
return false;
return true;
}
int main() {
string str = "XYXYXYX";
if (hasAlternateChars(str)) {
cout << "Valid String";
} else {
cout << "Not a Valid String";
}
}실행 결과
Valid String
코드 설명
위 예제에서 입력 문자열은 XYXYXYX입니다. 루프를 돌며 각 문자와 두 칸 뒤의 문자를 비교했을 때 모두 일치하고, 첫 번째 문자 'X'와 두 번째 문자 'Y'도 서로 다르므로 이 문자열은 유효한 교대 문자열로 판정되어 "Valid String"이 출력됩니다.
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리를 사용하지 않아 공간 복잡도는 O(1)입니다. 따라서 길이가 긴 문자열에 대해서도 효율적으로 동작합니다.