split 함수를 만들어본다.
다음과 같은 상황을 고려해야 한다.
1. 함수는 입력 문자열과 구분자를 매개변수로 받아야 합니다. 구분자는 문자열을 분리할 때 사용될 문자 또는 문자열입니다.
vector<string> split(string input, string delimiter)
2. 함수는 vector <string>을 반환해야 합니다. 각 분리된 문자열은 벡터의 요소로 저장되어야 합니다.
vector<string> split(string input, string delimiter){
vector<string> ret;
return ret;
}
3. 입력 문자열을 구분자를 기준으로 분리해야 합니다. 문자열을 구분할 때 구분자가 나타나는 위치를 찾는 방법이 필요합니다.
문자열에서 구분자를 찾는 방법으로는 일치하는 문자열 또는 일치하는 문자열의 위치를 찾는 함수를 사용할 수 있습니다. 예를 들어, find(), find_first_of() 또는 find_first_not_of() 함수 등이 유용할 수 있습니다.
각 함수의 시그니처와 필요한 매개변수에 대한 정보를 알려드리겠습니다:
1. find():
- 시그니처: `size_t find(const string& str, size_t pos = 0) const;`
- 매개변수:
- str: 찾을 문자열
- pos (옵션): 검색을 시작할 위치 (기본값은 0)
2. rfind():
- 시그니처: `size_t rfind(const string& str, size_t pos = npos) const;`
- 매개변수:
- str: 찾을 문자열
- pos (옵션): 역순으로 검색을 시작할 위치 (기본값은 문자열의 끝)
3. find_first_not_of():
- 시그니처: `size_t find_first_not_of(const string& str, size_t pos = 0) const;`
- 매개변수:
- str: 일치하지 않는 문자들의 집합
- pos (옵션): 검색을 시작할 위치 (기본값은 0)
4. find_last_of():
- 시그니처: `size_t find_last_of(const string& str, size_t pos = npos) const;`
- 매개변수:
- str: 찾을 문자들의 집합
- pos (옵션): 역순으로 검색을 시작할 위치 (기본값은 문자열의 끝)
5. find_last_not_of():
- 시그니처: `size_t find_last_not_of(const string& str, size_t pos = npos) const;`
- 매개변수:
- str: 일치하지 않는 문자들의 집합
- pos (옵션): 역순으로 검색을 시작할 위치 (기본값은 문자열의 끝)
6. strspn():
- 시그니처: `size_t strspn(const char* str, const char* delimiters);`
- 매개변수:
- str: 검색 대상 문자열 (C 스타일 문자열)
- delimiters: 구분자들의 집합 (C 스타일 문자열)
7. find_first_of()
- 시그니처: size_t find_first_of(const string& str, size_t pos = 0) const;
- 매개변수:
- str: 검색할 문자들의 집합을 나타내는 문자열입니다.
- pos (옵션): 검색을 시작할 위치를 나타내는 인덱스입니다. 기본값은 0이며, 문자열의 처음부터 검색을 시작합니다.
4. 문자열에서 구분자가 발견되면 해당 구분자 이전의 부분 문자열을 추출하여 결과 벡터에 추가해야 합니다.
5. 반복적으로 구분자를 찾아 문자열을 분리해야 합니다. 구분자가 없을 때까지 반복하면서 분리된 부분 문자열을 결과 벡터에 추가해야 합니다.
7. 문자열을 분리할 때 빈 문자열도 처리해야 합니다. 예를 들어, "apple,, banana"와 같은 경우, 두 개의 연속된 구분자 사이에 빈 문자열이 있어야 합니다.
#include <bits/stdc++.h>
using namespace std;
vector<string> split(string input, string delimiter){
vector<string> ret;
long long pos = 0;
string token = "";
while ( (pos = input.find_first_of(delimiter)) != string::npos){
token = input.substr(0, pos);
ret.push_back(token);
// 삭제를 시작할 위치, 삭제 될 갯수.
input.erase(0, pos + delimiter.length());
}
ret.push_back(input);
return ret;
}
int main() {
const vector<string> s = split("ab,,cd,,ef,, ,,ij", ",,");
for(string b : s ) cout << b << endl;
}
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
2309 (0) | 2023.06.26 |
---|---|
prefix sum (0) | 2023.06.25 |
순열 (0) | 2023.06.23 |
Recursion (0) | 2023.06.23 |
1. 선택정렬 (0) | 2021.05.30 |
댓글