🔎 split()

코딩테스트의 문제에는 문자열을 split() 해야하는 경우가 많다.
하지만 C++에서 제공하는 STL(Standard Template Library)에는 split()함수를 지원하지 않는다.
따라서 빠르게 함수로 구현하여 사용하는 것이 필요하다.

원하는 결과물

문자열이 원하는 delimiter(구분자)에 따라 split()되어 각각의 단어로 구성된 vector를 반환한다.

ex) string “안녕하세요! ReturnRudi 입니다.“를 delimiter “ “(공백) 으로 split()

​ vector [“안녕하세요!”, “ReturnRudi”, “입니다.”] 리턴


구현 원리

  1. find()를 사용하여 주어진 string에서 delimiter를 찾아 해당 위치를 반환한다

  2. substr()를 이용해 delimiter 이전까지 문자열을 잘라 vector에 push_back()한다

  3. 0부터 delimiter의 위치 + delimiter의 길이 까지를 erase()를 통해 문자열에서 지운다

  4. 1 ~ 3의 과정을 find()가 string::npos를 반환할 때까지 반복한다

    (find의 결과 delimiter를 찾지 못하면 string::npos를 반환한다)

  5. 남은 문자열을 vector에 push_back()한다 (잊지 않도록 주의)


구현 코드

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<string> split(string input, string delimiter) {
    ll pos = 0;
    vector<string> result;
    while ((pos = input.find(delimiter)) != string::npos) {     //과정 1, 4
        result.push_back(input.substr(0, pos));                 //과정 2
        input.erase(0, pos + delimiter.length());               //과정 3
    }
    result.push_back(input);                                    //과정 5

    return result;
}

int main() {
    string a = "안녕하세요! ReturnRudi 입니다.";
    vector<string> result = split(a, " ");
    for (string i : result) {
        cout << i << '\n';
    }

    return 0;
}


실행 결과

안녕하세요!
ReturnRudi
입니다.

시간복잡도

$O(n)$

태그:

카테고리:

업데이트:

댓글남기기