알고리즘 1번문제에 단골로 문자열을 다루는 문제가 나온다.
문자열 다룰때 필요한 2가지 팁을 적어본다.
1. find 함수
c++에서 find 함수는 string.find(찾고싶은 문자열)으로 사용할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "c++ 문자열 다루기";
cout<<s.find("문자열")<<endl;
}
/*
4
*/
해당 문자열이 존재하면 index값을 리턴한다.
그렇다면 이 코드를 보자
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "c++ 문자열 다루기";
if(s.find("c+++")) {
cout<<"yes"<<endl;
} else {
cout<<"no"<<endl;
}
}
무심코 봣을 땐 해당 코드에서 if 분기문에 걸려 "no"를 리턴할것 같지만 실제로 find 함수를 통해서 찾으려는 문자열이 없는 경우 npos라는 더미 값을 리턴하게 된다. 따라서 c++에서 문자열을 다루게 된다면 아래 코드처럼 작성해야한다.
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "c++ 문자열 다루기";
if(s.find("c+++") != string::npos) {
cout<<"yes"<<endl;
} else {
cout<<"no"<<endl;
}
}
/*
no
*/
의식적으로 npos를 활용하는 습관을 가지자.
2. split 함수
c++에는 split 함수가 존재하지 않는다. 따라서 직접 구현하거나 다른 방법을 사용해야한다.
하지만 다른 방법을 사용하기엔 쉽지 않다. 작은 문자열이면 subString으로 해결할 수 있지만 split 함수 정도는 외워두는 것이 좋다.
#include <bits/stdc++.h>
using namespace std;
vector<string> split(string input, string delimiter) {
vector<string> ret;
long long pos = 0; //delimiter가 input에서 위치한 index
string tmp = ""; //vector 값으로 split된 문자열
while((pos = input.find(delimiter)) != string::npos) { //구분자가 사용된 index가 존재한다면
tmp = input.substr(0,pos); //substr로 해당 문자열 파싱
ret.push_back(tmp); //vector에 저장
input.erase(0, pos + delimiter.length()); //저장된 문자열 삭제
}
ret.push_back(input); //구분자로 나누어져있지 않은 마지막 문자열 저장
return ret;
}
int main() {
string s = "c++ handle string";
vector<string> answer = split(s, " ");
for(string ss : answer) cout<<ss<<"\n";
}
/*
c++
handle
string
*/
이와 같이 사용하면 쉽게 split 함수를 사용할 수 있다.