有希
C++/문자열에서 앞 뒤 공백 제거, 문자열에서 공백을 없애고 split하기 본문
필요한 헤더는 <functional> <string>이다.
find_if는 있다면 해당 위치 반환, 없으면 두번째 인자를 반환한다. isspace의 not이므로 "123" 같은 경우는 1을 발견했으니 0의 iter를 반환하고, " " 같은 경우는 문자열의 end() iter를 반환해서 다 지운다.
string ltrim(const string &str) {
string s(str);
s.erase(
s.begin(),
find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
);
return s;
}
string rtrim(const string &str) {
string s(str);
s.erase(
find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
s.end()
);
return s;
}
공백이 몇 칸 있든간에 다 지우고 공백이 아닌 문자열들로 쪼개서 vector에 저장하는 split함수
마지막에 tokens.push_back() 해주는 이유는 "1 2 3"같은 상황에서 while에서는 2까지만 넣고 빠져나와 버린다. start는 3을 가리키는 상태로. 이 상태에서 substr(start)해주면 문자열에 끝까지 tokens에 다시 원소로 넣어준다. 이러면 위와 같은 상황에서 3이 잘 들어간다.
vector<string> split(const string &str) {
vector<string> tokens;
string::size_type start = 0;
string::size_type end = 0;
while ((end = str.find(" ", start)) != string::npos) {
tokens.push_back(str.substr(start, end - start));
start = end + 1;
}
tokens.push_back(str.substr(start));
return tokens;
}
'프로그래밍 > 알고리즘+코딩테스트' 카테고리의 다른 글
HackerRank/Lonely Integer (0) | 2022.03.29 |
---|---|
HackerRank/Mini-Max Sum (0) | 2022.03.29 |
HackerRank/Plus Minus (0) | 2022.03.29 |
LeetCode/787. Cheapest Flights Within K Stops (0) | 2022.03.24 |
프로그래머스/키패드 누르기 (0) | 2022.03.16 |