개요
대문자와 소문자를 모두 포함하는 임의의 길이의 문자열이 주어졌을 때, 그중 영어 알파벳과 같은 위치에 있는 문자의 개수를 계산하는 것이 이번 문제의 목표입니다.
예시
입력 − String str = eBGD 출력 − Count is: 2
설명 − B는 알파벳에서 두 번째, D는 네 번째 위치에 오는 문자이므로 B와 D가 원래 알파벳과 같은 순서로 배치되어 있습니다.
입력 − String str = Abcdeizxy 출력 − Count is: 5
설명 − A가 첫 번째 위치에 있고 그 뒤로 B, C, D, E가 차례로 이어지므로 A, B, C, D, E 다섯 개의 문자가 알파벳과 같은 위치에 있습니다.
해결 접근 방법
- 대문자와 소문자로 구성된 문자열을 입력받습니다.
- size() 함수로 구할 수 있는 문자열 길이만큼 인덱스 0부터 반복문을 실행합니다.
- 문자열에 대문자와 소문자가 모두 포함되어 있으므로 i == (str[i] - 'a') 또는 i == (str[i] - 'A') 조건을 검사합니다.
- 반복문 밖에서 0으로 초기화한 카운터 변수(예: res)를 선언하고, 조건을 만족할 때마다 반복문 내부에서 1씩 증가시킵니다.
- 반복이 끝나면 변수에 누적된 값을 반환합니다.
- 최종 결과를 출력합니다.
예제 코드
#include<iostream>
using namespace std;
int countalphabet(string str){
int res= 0;
// 문자열을 처음부터 끝까지 순회합니다
for (int i = 0 ; i < str.size(); i++){
// 대문자끼리, 소문자끼리 각각 연속된 코드 값을 가지므로
// 기준 문자와의 차이가 같다면 같은 알파벳 위치입니다
if (i == (str[i] - 'a') || i == (str[i] - 'A')){
res++;
}
}
return res;
}
// main 함수
int main(){
string str = "aBTutorIalspOiNT";
cout << "Count is:" << countalphabet(str);
return 0;
}
동작 원리
이 풀이의 핵심은 아스키(ASCII) 코드 값입니다. 소문자 'a'는 아스키 코드 97, 대문자 'A'는 65이며, 같은 계열의 문자들은 연속된 코드 값을 가집니다. 따라서 str[i] - 'a'는 현재 문자가 소문자 기준으로 몇 번째 알파벳인지, str[i] - 'A'는 대문자 기준으로 몇 번째인지를 나타냅니다. 이 값이 인덱스 i와 일치하면 해당 문자가 알파벳상 같은 위치에 있다는 의미입니다.
복잡도 분석
문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이고, 추가적인 메모리를 거의 사용하지 않으므로 공간 복잡도는 O(1)입니다.
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Count is: 2