728x90
728x170
문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 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
알고리즘 분류
- 구현
- 문자열
문제 출처
https://www.acmicpc.net/problem/1152
문제 해결 방법
- 정답률 30%대의 문제이다.
- 이 문제 해결 방법의 핵심 포인트는, 문자열 배열의 마지막에 공백(' ')을 넣어주는 것이었다.
- sentence.push_back(' ');
- 그 다음, 문자열의 길이 만큼 순회하면서 문자를 만날 경우 flag를 true로 설정한다. 그리고 공백을 만날 경우 flag가 true일 때 단어의 수(count)를 하나씩 증가시켜주는 방식으로 문제를 해결하였다.
- 결국 공백을 기준으로 단어의 개수를 체크하는 원리이다.
- 따라서 문자열의 마지막 공간에 문자가 있을 경우, 문자열 배열의 마지막에 공백을 따로 넣어주지 않는다면 마지막 문자는 카운팅되지 않게 된다.
- 결국 문자열 배열의 마지막에 공백(' ')을 넣어주는 작업이 필요하다.
코드
#include <iostream>
#include <string>
using namespace std;
int main() {
string sentence;
getline(cin, sentence);
sentence.push_back(' ');
bool isWord, flag;
int count;
isWord = false;
flag = false;
count = 0;
for (int i = 0; i < sentence.length(); i++) {
isWord = (sentence[i] != ' ');
if (isWord) {
flag = true;
}
else {
if (flag) {
count++;
}
flag = false;
}
}
cout << count << endl;
return 0;
}
채점 결과
728x90
그리드형(광고전용)
'Problem Solving > BaekJoon Online Judge' 카테고리의 다른 글
[BOJ2566][C++] 최댓값 (0) | 2022.10.24 |
---|---|
[BOJ2480][C++] 주사위 세개 (0) | 2022.06.15 |
[BOJ2525][C++] 오븐 시계 (0) | 2022.06.15 |
[BOJ2164][C++] 카드2 (0) | 2021.10.30 |
[BOJ21964][C++] 선린인터넷고등학교 교가 (0) | 2021.06.18 |
[BOJ5618][C++] 공약수 (0) | 2021.04.13 |
[BOJ2455][C++] 지능형 기차 (0) | 2021.02.08 |
[BOJ10757][C++] 큰 수 A + B (0) | 2021.02.05 |