습관처럼

C++ - 문자 및 문자열 찾기 본문

Language/C++

C++ - 문자 및 문자열 찾기

dev.wookii 2020. 6. 27. 12:49

알고리즘 문제를 풀때 가끔씩 string 안에서 찾고자 하는 문자 및 문자열을 찾아 변형 한거나 지우는 경우를 종종 볼 수 있습니다. 이때 고민하지 않고 바로 적용할 수 있도록 방법을 알아보도록 합시다~.

 

먼저 해당 문자를 찾기 위해서는 가장 먼저 떠오르른 것이 find라는 함수 입니다. 그러면 먼저 find 함수에 대해 알아봅시다.

a.find("substring")

말 그대로 사용하시면 됩니다. 하지만 문제는 리턴값이다. 이를 별 생각없이 사용하면 문제가 생길 수 있습니다. 보통 find로 포함되는지 확인하고 싶다면 어떻게 써야하는가? 아마 대부분의 예제에서는 아래처럼 표현할 것이다.

#include <iostream>

using namespace std;

int main() {
    string a="hi hello";

    if(a.find("hi")>=0){
        cout<<a.find("hi")<<endl;
    }
    if(a.find("hello")>=0){
        cout<<a.find("hello")<<endl;
    }
    return 0;
}

대부분의 경우 find를 보면 >=0과 비교해서 참인지 알아낼 것이다.

0
3

왜냐하면 find함수의 리턴값은 바로 그 문자열의 위치(배열번호 위치, 즉 0번 부터 시작한다.)를 반환하기 때문이다.

그래서 >=0으로 표현하는 것이다.

 

여기까지는 괜찮다. 그런데 문제는 문자열에 없는 경우를 짜려고 할 경우이다. 이때 다른 언어에서는 -1을 반환하는 경우가 많기에 무의식적으로 음수라고 생각하는 경우가 있다. 그런데 cpp에서는 그렇지 않다.

#include <iostream>

using namespace std;

int main() {
    string a = "hi hello";

    if (a.find("sub") == string::npos) {
        cout << a.find("sub") << endl;
    }
    return 0;
}

문자열이 매칭되지 않는것은 쌩뚱맞게도 어떤 숫자와 매핑되어 있다. 그래서 위와 같이 코드를 작성해줘야 문자열이 포함되지 않는 경우인 것이다. 출력해보면 매우 큰수로 연결되있음을 알 수 있다.

18446744073709551615

int형은 그냥 벗어난 long long형 데이터이다. 그러므로 문자열을 찾을 때 신중히 사용하여야 한다.

 

그렇다면 또 다른 방법을 알아보자~

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    string a = "hi hello";
    string b = "he";
    for(int i=0;i<a.size()-b.size();i++){
    	if(a.substr(i,b.size()).compare(b)==0){
        	cout<<i<<"\n";
            break;
        }
    }
    return 0;
}
3

"hi hello"에서 "he"를 찾으려고 할때 hi hello에서 찾으려고 하는 문자열의 사이즈만큼 이동을 해나가면서 찾는 방법입니다.

간단하게 설명하면~  hi와 he를 비교, i_  와 he를 비교, _h와 he를 비교, he와 he를 비교 해나가는 식으로 진행하면서 찾는 것입니다.

 

 

'Language > C++' 카테고리의 다른 글

C++ - Pair  (0) 2020.06.27
C++ - map, unordered_map  (0) 2020.06.27
C++ - Stack, Queue  (0) 2020.06.23
C++ - Quick Sort (feat Algorithm qsort())  (0) 2020.06.23
C++ - 중복제거  (0) 2020.06.23