문제
영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 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의 길이가된다.
'PS > 백준' 카테고리의 다른 글
백준 / 그리디 알고리즘 / 11047번 / 동전 0 / C++ (0) | 2020.09.23 |
---|---|
백준 / String(문자열) / 2908번 / 상수 / C++ (0) | 2020.05.28 |
백준 / String(문자열) / 1157번 / 단어 공부 / C++ (0) | 2020.05.27 |
백준 / String(문자열) / 2675번 / 문자열 반복 / C++ (0) | 2020.05.27 |