알고리즘 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 함수를 사용할 수 있다.

 

 

+ Recent posts