백준 1152번 (단어의 개수, C++, string) [BAEKJOON]

단어의 개수

https://www.acmicpc.net/problem/1152

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초128 MB280804875206992032.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

출처

알고리즘 분류


입력

문자열 문제를 많이 풀어본 적이 없어서 입력을 어떤 방법으로 받아야 하는지 난감했다.

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;
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤