당니의 개발자 스토리

[필수개념] split() 함수 본문

split()

코딩테스트에서 굉장히 자주 나오는 로직이다. 최고의 코드를 기반으로 설명하겠다.

그 전에 split() 함수에 대해 설명하자면,

이러한 문자열이 있다고 했다고 하자. '나는 띄어쓰기를 기준으로 쪼개어서 어떠한 배열을 만들고 싶어!' 라고 했을 때 사용되는게 split() 함수이다.

이러한 문자열을 split() 하게 되면, 여기에서는 띄어쓰기로 split 하므로,

배열에는 {aaa, bbb, ccc} 이렇게 담긴다.

C++에서는 이 split() 함수를 지원하지 않아서 우리가 만들어야 한다.

단순하게 3줄만 외우면 된다.

여기서 delimiter는 구분자다. 아까 띄어쓰기 같은 거다.

string의 find() 메서드를 써서 delimiter를 찾을 때마다, 못 찾고 문자열이 종료되기 전까지

루프가 돌아가는 거고, 못 찾으면 string::npos를 반환하면서 조건문에 맞지 않아 이 루프가 종료된다.

이게 뭐냐면,

빨간색 문자열이 있을 때, 아래와 같은 배열을 만들고 싶다고 해보자.

이 코드를 통해서 d의 pos(위치, 인덱스)를 찾는다.

처음에는 pos가 찾아지니까

pos = 3을 반환한다. 그리고 이 3은 string::npos가 아니기 때문에 while 루프 안으로 들어온다.

pos가 3이라서 token은 3만큼, 즉 substr(0, 3)이니까

0(= 인덱스 위치)에서 3(= 크기)만큼 input 문자열에서 추출해서

이렇게 token에 넣는다.

그리고 ret 배열에다가 token을 넣는다.

그리고 나서, vector의 push_back()으로 token 문자열을 넣어주고,

앞에서부터 delimeter가 끝난 데까지 문자열을 지운다.

input.erase(0, pos + delimeter.length()) 하면,

delimiter인 d의 길이가 1이고, pos가 3이므로, pos + delimiter.length() 하면 4가 된다.

4는 위치가 아니라 지우는 크기이므로, 따라서 abcd 를 input 문자열에서 지워버린다.

그 다음에

이 루프가 또 돌면서, d 라는 delimiter를 찾는다. 근데 더이상 input 문자열에는 d가 없기 때문에 find 메서드가 string::npos를 반환해서 루프가 종료된다.

그 다음에 남은 문자열을 ret에 집어넣어서 결과적으로 ret = {abc, abc}가 된다.

한번 돌려보자. 잘 돌아간다.

 

그런데 이렇게 하면, 매번 erase()를 하는 단점이 있다. 시간 초과가 난다면 이렇게 하면 된다.