단어의 개수
https://www.acmicpc.net/problem/1152
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 280804 | 87520 | 69920 | 32.047% |
문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다.
이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오.
단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다.
이 문자열의 길이는 1,000,000을 넘지 않는다.
단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다.
또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력
첫째 줄에 단어의 개수를 출력한다.
예제 입력 1
The Curious Case of Benjamin Button
예제 출력 1
6
예제 입력 2
The first character is a blank
예제 출력 2
6
예제 입력 3
The last character is a blank
예제 출력 3
6
출처
- 문제를 만든 사람: author5
- 데이터를 추가한 사람: clock, doju, jh05013
- 빠진 조건을 찾은 사람: djm03178, his130
- 내용을 추가한 사람: jh05013
알고리즘 분류
입력
문자열 문제를 많이 풀어본 적이 없어서 입력을 어떤 방법으로 받아야 하는지 난감했다.
cin 으로 받으면 ‘ ‘(공백)이 나오면 입력이 끝나버린다.
scanf로 입력을 받고 char로 처리하는 방법 [ char[1,000,001] 선언 후 처리]도 있었지만
해결 방법을 찾다 보니 <string> 에 getline() 함수를 이용하여 해결이 가능했다.
https://jhnyang.tistory.com/107 <- 참고
단어 카운트 방법
한 단어가 될 수 있는 경우는 str[i]가 공백이 아닐 때 str[i-1]이 공백인 경우 + 1 해주면 된다.
위의 로직은 0번 인덱스 범위를 벗어나 처리가 불가능 하므로 예외로 처리해준다.
통과된 코드
#include <iostream> #include <string> // getline using namespace std; int main() { string str; int cnt = 0; getline(cin, str); // getline 함수는 입력 스트림에서 문자들을 읽어서 // 인자로 받은 문자열에 저장 if (str[0] != ' ') { cnt++; } // 첫글자 처리 for (int i = 1; i < str.length(); i++) { if (str[i - 1] == ' ' && str[i] != ' ') cnt++; } cout << cnt; return 0; }