하나의 문자열(예: str)이 주어졌을 때, 각 문자의 왼쪽과 오른쪽 이웃 문자가 서로 동일한 경우를 찾아 그 개수를 계산하는 것이 목표입니다. 이 문제에서는 문자열의 첫 번째 문자와 마지막 문자는 인접한 문자가 하나뿐이므로 항상 개수에 포함된다는 규칙이 적용됩니다.
예시
입력 − string str = "poiot"
출력 − count is 3
설명 − 주어진 문자열에서 문자 p, t, i가 조건을 만족하므로 개수는 3이 됩니다.
입력 − string str = "nitihig"
출력 − count is 4
설명 − 주어진 문자열에서 문자 n, t, h, g가 조건을 만족하므로 개수는 4가 됩니다.
해결 접근 방법
문자열을 변수(예: str)에 입력받습니다.
length() 함수를 사용해 문자열의 길이를 구합니다. 이 함수는 공백을 포함한 전체 문자 수를 정수 값으로 반환합니다.
문자열의 길이가 2 이하라면 첫 번째와 마지막 문자만 존재하거나 문자가 하나뿐이므로, 모든 문자가 자동으로 포함됩니다. 따라서 문자열 길이를 그대로 반환합니다.
문자열의 길이가 2보다 크다면, 첫 번째 문자와 마지막 문자가 이미 포함되어 있으므로 count를 2로 초기화합니다.
인덱스 i를 1부터 시작하여 (length - 1)보다 작을 때까지 반복 루프를 실행합니다.
루프 내부에서 str[i-1] == str[i+1] 조건을 검사하여, 현재 문자의 왼쪽 이웃과 오른쪽 이웃이 같으면 count를 1 증가시킵니다.
반복이 끝나면 최종 count 값을 반환합니다.
결과를 화면에 출력합니다.
구현 예제 코드
#include <iostream>
using namespace std;
// 조건을 만족하는 문자 개수를 세는 함수
int countChar(string st){
int size = st.length();
// 길이가 2 이하이면 모든 문자가 포함됨
if (size <= 2){
return size;
}
// 첫 번째와 마지막 문자는 항상 포함
int result = 2;
// 문자열을 순회하며 이웃 문자 비교
for (int i = 1; i < size - 1; i++){
// 왼쪽 이웃과 오른쪽 이웃이 같으면 카운트 증가
if (st[i - 1] == st[i + 1]){
result++;
}
}
// 최종 결과 반환
return result;
}
int main(){
string st = "poiot";
cout << "count is " << countChar(st);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
count is 3
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 사용 없이 효율적으로 문제를 해결할 수 있습니다.