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;
}
다른 사람의 풀이 구경
조금 더 간단하게 풀어내는 방법이 없을까 고민하다가 다른 사람들의 풀이를 구경했다. 훨씬 깔끔하더라ㅜㅜㅜ 그러면 코드를 파헤쳐 보자
transform()
안에 iterator과::toupper
을 집어넣어 대문자처리 해준다.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;
}