#10820: 문자열 분석
문제:
문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.
각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.
입력:
첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.
풀이:
- 이 문제를 풀기 위해서는 ASCII 코드의 개념을 이해해야 편하다. ASCII에 관한 설명은 #10808: 알파벳 개수 문제 풀이 제일 처음에 간단하게 설명되어 있으니 한번 읽고 풀기를 권한다.
- 우선 이 문제는 줄이 몇개 주어지는지 가르쳐 주지 않고 최대 100이라는 것만 가르쳐 주었는데 for 반복문으로 100까지하면 오답 처리가 된다. 따라서 while 반복문에 getline(cin,string)을 넣어 입력이 없을 시 프로그램을 끝내는 방식을 사용해야 된다.
- 그 다음에는 문자열의 길이만큼 for 반복문을 도는데 각각 상황에 맞게 answer 배열의 값을 1씩 올려주면서 세어준다. 소문자인 경우로 예를 들면 굳이 모든 소문자를 if인 경우에 적어줄 필요 없이 범위로 나타내어 풀 수 있다. 왜냐하면 ASCII 코드표를 보면 a부터 z까지는 순서대로 돼있기 때문이다.
- 출력 후에는 바로 초기화 해줘야 된다. 왜냐하면 새로운 문자를 받고도 0으로 초기화 안되고 전에 출력 했던 값이 아직도 저장 돼 있으면 원래 있던 답에 또 더해진 값을 출력하기 때문에 첫번째 입력은 맞지만 두번째 입력부터는 틀린 답을 출력하게 된다.
코드:
#include <iostream>
using namespace std;
int main(){
string s;
//배열 값 0으로 초기화
int answer[4] = {};
//입력을 못 받으면 프로그램 종료
while(getline(cin,s)){
for(int i = 0; i < s.size(); i++){
//소문자일 때
if(s[i] >= 'a' && s[i] <= 'z') answer[0]++;
//대문자일 때
else if(s[i] >= 'A' && s[i] <= 'Z') answer[1]++;
//숫자일 때
else if(s[i] >= '0' && s[i] <= '9') answer[2]++;
//공백일 때
else if(s[i] == ' ') answer[3]++;
else continue;
}
//출력
for(int i = 0; i < 4; i++){
cout << answer[i] << " ";
answer[i] = 0; //출력 후 0으로 초기화
}
}
}
Leave a comment