아무리 생각해도 배열에 값을 여러개 저장하고, for문을 뺑뺑 돌리는 방법밖에 생각이 안나서,
풀면서 유용한 STL이 뭔지 찾아보며 풀었던 문제
본 포스팅은 개인학습용으로 작성된 문서입니다. 부족한 점이 있다면 알려주시면 감사하겠습니다 :)
// 백준 1152번 단어의 갯수
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main(){
string a, b;
int cnt = 0;
getline(cin, a); //공백까지 함께 입력받으며 개행문자 전까지 입력
//a = cin.get();// 공백까지 함께 입력 , 개행까지 입력 :: 문자열전용
if(a.find(' ') == 0){ a.erase(0,1);}
istringstream ss(a);
while(getline(ss, b, ' ')){
cnt++;
}
cout << cnt;
}
단어는 띄어쓰기 한칸으로 구분
문자열을 공백문자 포함하여 개행문자 전까지 입력 받아야 한다
-> string라이브러리의 getline(cin, string);
getline(입력스트림 오브젝트, 문자열 저장할 string객체, [종결문자]);
입력받은 문자열을 '띄어쓰기'로 구분해야 한다.
-> sstream 라이브러리의 istringstream;
(?) sstream - string과 stream 을 합쳐버린 라이브러리..?
istringstream
문자열 포맷을 pasing할 때 사용한다.
string a = "ABC abc DE de";
stringstream ss(a);
cout << ss.str();
// 출력결과
ABC adc DE de
string a = "ABC abc DE de";
string b;
stringstream ss(a);
while(getline(ss, b, ' ')){
cnt++;
}
cout << cnt;
while문을 사용해 더이상 구분할 문자열이 없을때까지
ss를 공백문자를 기준으로 나누어 문자열로 분리해준다.
분리할때마다 cnt를 세어 단어수를 센다.
if(a.find(' ') == 0){ a.erase(0,1);}
공백문자의 위치가 0 이면 문자열의 0번째부터 1개의 값을 제거한다.