PS/백준

백준 / String(문자열) / 1152 / 단어의 개수 / C++

KimMinJun 2020. 5. 28. 09:42

문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

 

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

int main() {
	int cnt = 0;
	string str;
	getline(cin, str);

	cnt++;
	for (int i = 0; i < str.length(); i++) {
		if (str[i] == ' ') {
			cnt++;
		}
	}

	if (str[0] == ' ') {
		cnt--;
	}

	if (str[str.length() - 1] == ' ') {
		cnt--;
	}

	cout << cnt << endl;
}

이번 문제는 getline과 cin의 차이점에 대해 알아야한다.

처음에 cin >> str로 입력받았다가 안되서 한참 헤맸다.

cin은 띄어쓰기 전까지 입력받고, 띄어쓰기 포함 입력받으려면 getline(cin, str)을 해줘야한다.

밑의 알고리즘에서는, 단어의 개수는 (띄어쓰기 갯수 + 1) 이므로, 일단 처음에 cnt를 하나 더해준다.

공백이 없을때도 단어의 개수는 하나이기 때문이다.

그리고 처음에 공백이 올때, 마지막에 공백이 올때 cnt를 하나씩 빼준다.

str.length()는 str의 마지막의 다음을 return하므로, 1을 빼주면 str의 길이가된다.