개요
대문자, 소문자, 특수 문자, 숫자가 모두 섞여 있는 문자열이 주어졌을 때, 각 유형별 문자가 몇 번 등장하는지 빈도를 계산하는 것이 이번 문제의 목표입니다. C++에서는 각 문자의 아스키(ASCII) 값을 기준으로 범위를 비교하는 간단한 방법으로 이를 해결할 수 있습니다.
문자 분류 기준
- 대문자(Uppercase) — A~Z, 아스키 값 65~90 (65와 90 포함)
- 소문자(Lowercase) — a~z, 아스키 값 97~122 (97과 122 포함)
- 숫자(Numeric) — 0~9, 아스키 값 48~57 (48과 57 포함)
- 특수 문자(Special Characters) — !, @, #, $, %, ^, &, * 등 위 항목에 해당하지 않는 나머지 문자
입력 · 출력 예시
입력 — str = Tutori@lPo!n&90
출력
문자열 내 대문자 개수: 2
문자열 내 소문자 개수: 8
문자열 내 숫자 개수: 2
문자열 내 특수 문자 개수: 3
입력 — str = WELc0m$
출력
문자열 내 대문자 개수: 3
문자열 내 소문자 개수: 2
문자열 내 숫자 개수: 1
문자열 내 특수 문자 개수: 1
알고리즘 접근 방식
- 대문자, 소문자, 특수 문자, 숫자가 포함된 문자열을 입력받습니다.
- 문자열의 길이(length)를 구합니다.
- 대문자, 소문자, 특수 문자, 숫자의 개수를 저장할 변수를 각각 선언하고 0으로 초기화합니다.
- 인덱스 0부터 문자열 길이까지 반복하는 FOR 루프를 시작합니다.
- 루프 내부에서 str[i]가
'A'이상'Z'이하라면 대문자 카운트를 증가시킵니다. - str[i]가
'a'이상'z'이하라면 소문자 카운트를 증가시킵니다. - str[i]가
'0'이상'9'이하라면 숫자 카운트를 증가시킵니다. - 그 외의 경우에는 특수 문자 카운트를 증가시킵니다.
- 루프가 끝나면 각 카운트 값을 출력합니다.
C++ 구현 예제
#include<iostream>
using namespace std;
//대문자, 소문자, 특수 문자, 숫자 개수를 세는 함수
void count(string str){
int Uppercase = 0;
int Lowercase = 0;
int digit = 0;
int special_character = 0;
for (int i = 0; i < str.length(); i++){
if (str[i] >= 'A' && str[i] <= 'Z'){
Uppercase++;
}
else if(str[i] >= 'a' && str[i] <= 'z'){
Lowercase++;
}
else if(str[i]>= '0' && str[i]<= '9'){
digit++;
}
else{
special_character++;
}
}
cout<<"Total Upper case letters in a string are: "<<Uppercase<< endl;
cout<<"Total lower case letters in a string are: "<<Lowercase<< endl;
cout<<"Total number in a string are: "<<digit<< endl;
cout<<"total of special characters in a string are: "<<special_character<< endl;
}
int main(){
string str = "Tutori@lPo!n&90";
count(str);
return 0;
}
실행 결과
위 코드를 컴파일하여 실행하면 다음과 같은 출력을 확인할 수 있습니다.
Total Upper case letters in a string are: 2 Total lower case letters in a string are: 8 Total number in a string are: 2 total of special characters in a string are: 3
추가 팁: 표준 라이브러리 활용하기
직접 아스키 값 범위를 비교하는 대신, <cctype> 헤더가 제공하는 isupper(), islower(), isdigit() 함수를 사용하면 코드를 더욱 간결하게 작성할 수 있습니다. 또한 이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n), 공간 복잡도는 O(1)로 매우 효율적입니다.