백준 - 단계별로 풀어보기 [1152] 단어의 개수
https://www.acmicpc.net/problem/1152
문제
영어 대소문자와 띄어쓰기로 이루어진 문자열을 입력받고, 문자열 안에 들어있는 단어의 수를 구하는 프로그램을 짜는 문제이다. 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
단어는 띄어쓰기로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.
풀이
문제의 조건에서 볼 수 있듯이, 공백을 포함한 문자열을 받아야하기 때문에, cin 함수보다는 getline 함수를 활용하여 문자열을 입력받아야한다.
#include <string>
...
string str;
getline(cin, str);
string을 받아오는 getline함수는 string 헤더파일에 들어있으며, 위의 경우 getline함수를 통해 표준 입력 cin을 str에 저장하라는 의미이다.
이를 통해 공백을 포함한 문자열을 입력 받을 수 있다.
따라서, 입력받은 문자열을 탐색하면서 공백이 있을 경우 단어의 카운팅을 늘려주면 된다.
단, 문자열에 연속된 공백은 없고, 문자열 앞과 뒤에는 공백이 있을 수 있다고 문제에 제시되어있으므로, 문자열의 맨 앞과 맨 뒤가 공백일 경우엔 새로운 단어가 아니므로 카운트를 1씩 줄여주면 해결되는 문제이다.
코드
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin,str);
int count = 0;
bool space = false;
if(str.empty())
{
cout << "0";
return 0;
}
count = 1;
for(int i = 0; i < str.length(); i++)
{
if(str[i] == ' ')
count++;
}
if(str[0] == ' ')
count--;
if(str[str.length()-1] == ' ')
count--;
cout << count;
return 0;
}
평가
공백을 포함한 문자열을 받는 방법에 익숙하지 않은 사람이 많아 정답률 25.565%라는 낮은 수치가 나오지 않았을까싶다.
C++에서 공백을 포함한 문자열을 받는 방법에 대해서 배울 수 있는 문제여서 포스팅을 진행하였다.
이번 문제에서는 getline함수의 사용법을 익히는 것에 중점을 두는 것이 좋을 듯 하다.
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준 / BOJ] - 1316번 그룹 단어 체커 C++ 풀이 (0) | 2020.02.09 |
---|---|
[백준 / BOJ] - 2941번 크로아티아 알파벳 C++ 풀이 (2) | 2020.02.07 |
[백준 / BOJ] - 1018번 체스판 다시 칠하기 C++ 풀이 (1) | 2020.02.06 |
[백준 / BOJ] - 1157번 단어 공부 C++ 풀이 (0) | 2020.02.03 |
[백준 / BOJ] - 10809번 알파벳 찾기 C++ 풀이 (0) | 2020.01.30 |