[백준/C++]#10820 - 문자열 분석

2021. 1. 14. 13:20필요/코딩테스트(백준)

풀이

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	while (getline(cin, s)) {		// 문자열을 입력받을 때마다 반복
	    int a=0,b=0,c=0,d=0;
	    for (int i=0; i<s.size(); i++) {	// 문자열의 길이마다 반복
		    if (s[i] >= 'a' && s[i] <= 'z') a++;
		    else if (s[i] >= 'A' && s[i] <= 'Z') b++;
		    else if (s[i] >= '0' && s[i] <= '9') c++;
		    else if (s[i] == ' ') d++;
	        }
	    cout << a << " " << b << " " << c << " " << d << '\n';
	}
	return 0;
}

C++ 개념

string 라이브러리를 사용했다. getline()은 string의 함수이며, 띄워쓰기도 입력으로 받는 특징이 있다.

또한 string 라이브러리의 문자열의 길이를 입력받는 size() 함수를 사용했다. 이 컴파일러에서는 size() 함수는 O(1)의 시간복잡도를 가지므로 조건안에 넣어도 무방하다.

하지만 C언어의 strlen()은 O(n)의 복잡도를 가지므로 반복문의 조건에 들어가면 O(n^2)의 시간복잡도가 발생한다.


풀이 

 

앞서 풀었던 #10951문제와 동일하게 입력의 개수가 주어지지 않는다. 따라 반복 조건 안에 getline 함수를 넣어 EOF까지 입력받게한다. 반복문에서는 문자를 소문자, 대문자, 숫자, 공백으로 분류했다.

아스키코드를 반드시 사용해야한다고 생각했는데, 없이도 문자를 사용해 비교가 가능했다.

+a

 

처음에는 문자->숫자로 변경하기 위해 s[i]-'0'을 했다. 이렇게 하고 아스키코드를 통해 int 값을 비교하니 조건문에서 제대로 분류되지 못하고 누락되는 경우가 발생한다. 그 이유는,, 아직 잘 모르겠다,, 나중에 알게되면 추가할 예정이다.