Baekjoon

[백준 C++] 1152번 - 단어의 개수

yujin0517 2022. 1. 9. 15:54

1152번 - 단어의 개수 

 

예제

* 문장이 공백으로 시작하든 공백으로 끝나든 상관없이 단어의 개수만 세는 게 중요함.

 

방법 1. vector사용

<코드 작성>

메인 함수와 split함수(vector타입의 함수)로 나눠서 구현

* split함수

  1. 매개 변수로 입력받은 문자열(input)과 단어 사이를 구분해줄 문자(part)를 사용한다. 
  2. stringstream은 공백과 '\n'을 제외하고 자료형에 맞는 문자열을 빼오는 역할을 한다. 
  3. 공백에 따라 분리된 ss를 tmp에 대입하고, tmp를 result에 붙여 넣는 과정을 반복한다. 
  4. 완성된 result를 리턴한다.  

* main 함수

  1. string 타입으로 문자열을 입력받는다.
  2. split함수를 호출하여 결과를 output 배열에 저장한다. 
  3. for문을 사용하여 해당 output 배열에 아무 값도 들어있지 않을 경우는 continue 하고 단어 개수를 카운트한다. 
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

//입력 받은 문자열을 공백을 기준으로 분리하는 함수 
vector<string> split(string input, char part) {
	vector<string> result;  //공백으로 나눠진 단어를 저장할 vector타입의 변수 선언
	stringstream ss(input);  //string타입으로 input에 입력된 정보를 추출
	string tmp;  

	while (getline(ss, tmp, part)) {
		result.push_back(tmp);  //part로 구분된 단어를 result에 추가 
	}

	return result;
}

int main() {
	int cnt = 0;  //단어 개수
	string input;  //문자열을 입력 받을 변수
	getline(cin, input);  //공백을 포함하여 문자열 입력 받기

	vector<string> output = split(input, ' '); //split함수 호출

	for (int i = 0; i < output.size(); i++) {
		if (output[i] == "") continue;
		cnt++;
	}

	cout << cnt;
	return 0;
}

문제를 보는 순간 split함수가 생각나서 따로 함수를 만들어 동일한 기능을 하도록 구현하였습니다. 

push_bact()을 사용하여 공백으로 분리된 단어를 저장한 배열을 완성했습니다. 

처음 문제를 풀 때, 메인 함수에서 단어의 개수를 카운트하는 과정에서 시작과 끝에 공백이 포함되어 있는 경우를 고려하지 않아서 틀리기도 했습니다. 

하지만 for문 안에서 조건문을 사용하여 배열에 아무 값이 들어있지 않을 경우 카운트하지 않도록 구현하였더니 문제를 맞힐 수 있었습니다. 

vector사용

 

방법 2. flag변수 사용

#include <iostream>
#include <string>
using namespace std;

int main() {
	int cnt = 0;  //단어 개수
	bool flag = true;  //공백인지 체크

	string str;  //문자열 변수 선언
	getline(cin, str);  //공백을 포함한 문자열 입력 받기

	for (int i = 0; i < str.length(); i++) {
		if (str[i] == ' ') flag = true;  //공백일 경우 true
		
		else if (flag) {  //공백이 연속되는 경우는 없음
			//즉, true일 경우에는 flag를 false로 바꿔주고 단어 개수 1 증가.
			flag = false;  //
			cnt++;
		}
	}
	cout << cnt;
	return 0;
}

이 방법은 위의 vector를 사용한 방법보다 훨씬훨씬 간단합니다. (처음부터 이렇게 문제를 풀었더라면,,,,)

플래그 변수를 사용하는 방법입니다!

bool타입으로 선언된 flag변수를 true로 초기화하고 시작합니다.

입력 받은 문자열의 길이만큼 반복문을 실행하면서 조건문을 사용하여 공백이 나올 경우 flag를 true로 바꿔줍니다. 

공백이 연속되는 경우는 없기에 else if문에서 바로 flag를 false로 바꿔주고, 단어의 개수를 1씩 증가해줍니다. 

이 방법으로 문제를 풀 때는 true일 때 공백인지 false일 때 공백인지만 정확하게 표시하고 시작하는게 가장 중요하다고 생각합니다. 조건문을 사용하기 때문에 이왕이면 공백일 때 true로 가정하는 것이 편하다고 생각합니다!

플래그 변수 사용

 

감사합니다!

2022.01.09