본문 바로가기

■ C++/STL 알고리즘

대소문자를 구분하지 않는다는 조건에 대하여 (대/소문자 변경)

우리가 문제를 해결하다 보면 대소문자를 구분하지 않고 문자열을 비교해야 하는 경우가 있습니다.

"Talk" 와 "taLk" 를 같은 문자열로 보겠다는 뜻입니다.


어떻게 하면 이 두 문자열을 같은 문자열로 만들어 줄 수 있을까요?


간단한 방법이 하나 있습니다.

모든 영문자를 대문자로 변경하거나 소문자로 변경해주면 됩니다.


저는 소문자로 변경해주는 방법에 대해서 이야기해보겠습니다.

가장 먼저 떠오르는 생각은 반복문으로 문자열의 첫 문자부터 끝 문자까지 확인하면서 대문자를 소문자로 변경해주는 방법입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<vector>
#include<string>
using namespace std;
 
int main()
{
    vector<string> vt = {"Talk""taLk"};
    cout<<"before: "<<vt[0]<<" "<<vt[1]<<endl;
 
    for (string &str : vt) {
        for(char &ch : str){
            if('A'<=ch&&ch<='Z')
                ch += 32;
        }
    }
    cout<<"after: "<<vt[0]<<" "<<vt[1]<<endl;
    return 0;
}
cs


[실행 결과]



이렇게요!


하지만 STL을 이용하면 더 쉬워집니다.


algorithm 헤더 파일에 있는 transform 함수를 사용하는 방법입니다.


transform()은 네 개의 인자를 받습니다.


첫 번째 인자 : 변경할 문자열의 시작을 가리키는 이터레이터

두 번째 인자 : 변경할 문자열의 끝을 가리키는 이터레이터

세 번째 인자 : 변경할 문자열의 시작을 가리키는 이터레이터

네 번째 인자 : 지정한 범위 내의 문자열에 적용할 함수 (::tolower 은 대문자를 소문자로 변경, ::toupper 은 소문자를 대문자로 변경)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<vector>
#include<cctype>
#include<string>
#include<algorithm>
using namespace std;
 
int main()
{
    vector<string> vt = {"Talk""taLk"};
    cout<<"before: "<<vt[0]<<" "<<vt[1]<<endl;
 
    for(int i=0; i<vt.size(); i++){
        transform(vt[i].begin(), vt[i].end(), vt[i].begin(), ::tolower);
    }
    /*
    for (string &str : vt) {
        for(char &ch : str){
            if('A'<=ch&&ch<='Z')
                ch += 32;
        }
    }
    */
    cout<<"after: "<<vt[0]<<" "<<vt[1]<<endl;
    return 0;
}
cs


쉽죠? 대소문자를 구분하지 않아야 할 경우엔 위와 같은 방법으로 해결해보세요!