이진 문자열(binary string)이 주어졌을 때, 문자열 안에 연속으로 같은 문자가 존재하는지 확인하는 것이 이번 문제의 목표입니다. 연속된 동일 문자가 있다면 그 문자열은 유효하지 않고(invalid), 없다면 유효한(valid) 문자열로 판단합니다.
예를 들어 "101010"처럼 0과 1이 번갈아 나타나는 문자열은 유효하지만, "10111010"처럼 '11'이 연속으로 등장하는 문자열은 유효하지 않습니다.
해결 접근 방식
이 문제는 매우 간단하게 해결할 수 있습니다. 문자열을 왼쪽부터 오른쪽까지 한 번 순회하면서, 인접한 두 문자가 서로 같은지 비교합니다.
- 인접한 두 문자가 같으면 → 즉시 false(유효하지 않음)를 반환
- 끝까지 순회했는데도 같은 문자가 없으면 → true(유효함)를 반환
이 알고리즘의 시간 복잡도는 O(n)이며, 공간 복잡도는 O(1)로 매우 효율적입니다.
C++ 구현 예제
#include <iostream>
#include <algorithm>
using namespace std;
bool isConsecutiveSame(string str){
int len = str.length();
for(int i = 0; i < len - 1; i++){
if(str[i] == str[i + 1])
return false;
}
return true;
}
int main() {
string str = "101010";
if(isConsecutiveSame(str))
cout << "No consecutive same characters";
else
cout << "Consecutive same characters found";
}실행 결과
No consecutive same characters
코드 설명
isConsecutiveSame 함수는 문자열의 길이에서 1을 뺀 범위만큼 반복하면서 현재 문자 str[i]와 다음 문자 str[i+1]을 비교합니다. 두 문자가 같다면 연속된 동일 문자가 존재한다는 의미이므로 바로 false를 반환하고, 모든 비교를 통과하면 true를 반환합니다.
예제에서 사용한 "101010"은 모든 인접 문자가 서로 다르기 때문에 "No consecutive same characters"라는 결과가 출력됩니다.