1 minute read

백준 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