split
string이 주어져 있을 때 내가 원하는 글자를 기준으로 잘라 배열에 저장시키는 기능.
find( 찾을 글자, 찾기 시작할 위치 )
String 함수로써 string 글자에서 원하는 글자를 찾아 시작 위치를 반환받을 수 있습니다.
( Overloading 되어있기 때문에 parameter가 더 있음 )
관련 글
[C++] Split #2 - multiple delimiter split 함수 구현
이번에는 C++에서 split 기능을 구현해보겠습니다. C++로 string 알고리즘 문제를 푼 사람들은 알 겁니다. 다른 언어에 비해 C++가 string 관련 함수가 아주 빈약하다는 것을... 저도 마찬가지로 string 알고리즘 문제를 풀 때마다 "C++ split" 이라는 키워드로 구글링을 했습니다. 상당한 불편함을 느꼈고 왜 C++은 split 함수가 없을까라는 한이 섞인 불만을 표출하곤 했습니다. 하지만 어쩔 수 없습니다. 다른 언어들은 이미 구현되어 있는 split 함수를 사용하면 되지만 C++은 직접 구현해서 선언해야 하기 때문에 반드시 숙지해야 합니다!!
split 기능의 원리
split을 구현하기 전 원리를 알기 위해 예시를 하나 만들겠습니다. string 변수 S가 "ABXXBXXAXXXD"라는 값을 가질 때 "XX"를 delimiter로 삼아 split 기능을 수행한다면 어떤 알고리즘으로 구현될까요? 아래 그림에서 단계적인 과정을 살펴보겠습니다. 우리는 우선 start와 end라는 S의 index 위치를 가리키는 변수를 만들고 가장 핵심적인 string 함수 find()를 사용하겠습니다. string 변수에서 find() 함수를 사용하면 원하는 글자의 시작 위치를 반환받을 수 있습니다.
find( 찾을 글자, 찾기 시작할 위치 ) String의 함수로써 변수 s가 있다고 가정했을 때 s.find("XX", 4) 처럼 사용할 수 있다. 이 기능은 변수 s의 index 3부터 "XX"를 찾아 시작 위치를 반환한다. 만약 찾지 못한 경우 npos를 반환한다. |
start 변수에 0을 넣고 find()를 통해 반환받은 위치를 end라고 한다면 우리는 아래 그림처럼 "AB"라는 string을 얻을 수 있고 result라는 vector 변수에 push_back()할 수 있습니다. 그다음부터는 계속 반복적인 작업으로써 start를 위에서 찾은 delimiter 바로 다음으로 위치시킵니다. 그리고 다시 find()를 통해 반환받은 위치를 end라고 한다면 우리는 두 번째 글자인 "B"를 result에 추가할 수 있고 S의 끝에 도달할 때까지 반복적으로 split 된 글자들을 result에 넣을 수 있습니다.
이러한 알고리즘으로 구현된 split 함수의 특징으로는 delimiter가 1글자 이상인 string이 올 수 있다는 점입니다. 하지만 제한적인 부분도 존재합니다. 만약에 내가 delimiter가 한 개가 아닌 다수의 delimiter로 문자열을 split 하고 싶을 때는 위와 같은 방법으로는 불가합니다 ( 구현할 수는 있지만 코드가 상당히 복잡해질 것으로 예상됨 ).
다음 글에 작성할 "Split #2 - multiple delimiter split 함수 구현"에서는 delimiter가 1글자만 가능하지만 multiple delimiter가 가능한 split 함수를 구현해보겠습니다.
그렇다면 이번 글에서 설명한 원리의 split 함수 구현 코드를 보도록 합시다.
C++ Code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> split(string s, string d){
vector<string> result;
auto start = 0U;
auto end = s.find(d);
while (end != string::npos){
result.push_back(s.substr(start, end - start));
start = end + d.length();
end = s.find(d, start);
}
result.push_back(s.substr(start, end));
return result;
}
int main()
{
string s = "ABXXBXXAXXXD";
vector<string> split_result = split(s, "XX");
for(int i=0; i < split_result.size(); i++)
cout << "split element " << i << " : " << split_result[i] << endl;
}
'Computer Science > C++' 카테고리의 다른 글
[C++] Split #2 - multiple delimiter split 함수 구현 (0) | 2021.02.02 |
---|---|
[C++] 2차원 배열 행렬 바꾸기 (0) | 2021.01.25 |
[C++] 2차원 배열 90도 회전 (2) | 2021.01.23 |
[C++] 2차원 배열 특정 값 초기화 (0) | 2021.01.17 |
[C++] 구조체 생성자 오버로딩 Struct Constructor Overloading (0) | 2021.01.10 |