728x90
반응형

문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까?
이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다.
단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다.
또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

예제 입력 1

The Curious Case of Benjamin Button

예제 출력 1

6

예제 입력 2

Mazatneunde Wae Teullyeoyo

예제 출력 2

3

예제 입력 3

Teullinika Teullyeotzi

예제 출력 3

2

 

내가 작성한 코드 (C++ 성공)

#include <iostream>
#include <string>

#define MAX 1000001

using namespace std;

int main(){
	string str;
	int cnt = 1;

	getline(cin, str);
	
	for(int i=0; i<str.length(); i++){
		if(str[i] == ' '){ // 공백인 경우
			cnt++;
		}
	}
	
	if(str[0] == ' ' || str[0] == '\0'){ // 처음 공백이 오는 경우 
		cnt--;
	}
	
	if(str[str.length()-1] == ' '){ // 맨 뒤가 공백일 겨우 
		cnt--;
	}
		
	cout << cnt;

	return 0;
}

 

정리

공백을 기준으로 단어의 갯수를 알아내는 문제였다.

#include <iostream>
#include <string.h>
#include <stdio.h>
#define MAX 1000001

using namespace std;

int main(){
	char str[MAX];
	int cnt = 1;
	gets(str);
	
	cout << "strlen = " << strlen(str) << "\n";
	
	for(int i=0; i<strlen(str); i++){
		cout << "[" << str[i] << "]";
		if(str[i] == ' ' && str[i-1] != ' '){
			cnt++;
		}
	}
	
	if(str[0] == ' ' || str[0] == '\0'){
		cnt--;
	}
	
	cout << "\n" << cnt << "\n";

	return 0;
}

맨 처음 이 문제를 보고 답으로 제출했던 코드다.
char형 배열로 gets를 이용해 문자열을 입력받았다.
컴파일 에러가 나서 찾아보니 gets를 사용하면 위험하기때문에 되도록 사용하지 말라는 글을 보았다.
그 이유는 아래 블로그에 정리되어 있는 내용을 읽어보고 알 수 있었다.

gets를 쓰면 안되는 이유

그래서 이 글을 보고 코드를 전부 지우고 다시 처음부터 작성했다.

처음에 공백이 나오는 경우를 제외해주었고

문자를 입력하고 공백을 통해 갯수를 증가시키는 생각을 했었다.
그래서 조건으로 공백이면서 앞에 문자가 있는 경우만 카운트를 증가시켜주었다.
그런데 공백만 나오는 경우 단어의 개수가 1개가 나오는 예외가 발생했다.
그래서 마지막에 공백이 나오면 카운트를 감소시켜주는 방법을 통해 처리해주었다.

그리고 정말 어떤 부분이 틀렸는 지 몰라 질문들을 둘러보다가 좋은 힌트가 있어 참고했던 것 같다.
질문 게시판에 올라와있는 만족해야하는 조건을 다시 한 번 보고나서 수정 후 성공할 수 있었다.

단어의 개수 F A Q

 

728x90
반응형
복사했습니다!