프로그래머스 원하는 문자열 찾기 문제 바로가기

lowercase, uppercase

C++에서 string을 lowercase 또는 uppercase하는 방법은 정말 다양하다. 1) transform()안에 iterator과 tolower()함수를 넣는 경우. 2) ASCII 아스키 코드를 이용해서 대문자->소문자로 바꾸는 경우 3) boost에서 to_lower() 함수를 불러와서 바꾸는 경우. 사실 가장 간단한 것은 boost 방식이라 이를 이용해서 문제를 해결했다.

내 풀이

myString의 각 자리를 pat의 첫 번째 요소와 비교해가며 조건을 만족하는 경우 1을 return하도록 했다. 이중 for문이라 시간복잡도는 O(n*m)이다.

#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>

using namespace std;

int solution(string myString, string pat) {
    boost::algorithm::to_lower(myString);
    boost::algorithm::to_lower(pat);
    
    int count = 0;
    
    if (myString.size() < pat.size()){
        return 0;
    }
    
    for (int i=0; i<myString.size()-pat.size()+1; i++){
        count = 0;
        for (int j=0; j<pat.size(); j++){
            if (myString[i+j] == pat[j]){
                count++;
                if (count == pat.size()){
                    return 1;
                }
            }
        }
    }
    
    return 0;
}

다른 사람의 풀이 구경

조금 더 간단하게 풀어내는 방법이 없을까 고민하다가 다른 사람들의 풀이를 구경했다. 훨씬 깔끔하더라ㅜㅜㅜ 그러면 코드를 파헤쳐 보자

  1. transform()안에 iterator과 ::toupper을 집어넣어 대문자처리 해준다.
  2. string::npos는 찾는 대상이 없을 때의 반환값인데, myString.find(pat)처럼 문자열을 직접 찾아도 된다는 점은 처음 알게 되었다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(string myString, string pat) {
    transform(myString.begin(),myString.end(),myString.begin(),::toupper);
    transform(pat.begin(),pat.end(),pat.begin(),::toupper);

    return myString.find(pat) != string::npos;
}

출처

References