1. 문제 접근
- 문자열 패턴 (ex. c*a)는 * 앞뒤로 한 글자가 아님에 유의하자.
- 또한 문자열 패턴보다 길이가 작은 글자가 들어오는 경우 예외처리를 잘 해줘야 한다.
- 패턴은 aa*aa인데, aa가 들어올 수도 있는데, 예외처리를 안하게 되면 오답이 날 수 있음
2. 시행착오
- 처음에는 단순히 *앞 문자열(이하 prefix) 먼저 찾아서 지우고, 지운 문자열에 *뒤 문자열(이하 suffix)이 끝에 있나 비교하는 방식으로 복잡하게 진행했음
void solve(string s){
int first_pos, second_pos;
first_pos = s.find(first);
if(first_pos != string::npos && first_pos == 0) {
s.erase(0, first_pos+first.length());
second_pos = s.find(second);
if(second_pos != string::npos && second_pos == s.size() - second.length()) {
cout << "DA" << "\n";
return;
}
}
cout << "NE" << "\n";
return;
}
- 패턴보다 입력이 들어오는 문자열의 길이가 작은 경우를 고려하지 못했음
substr()
의 인자로 position만 들어와도 된다는 점을 간과
- 즉, 지금 pos부터 모든 문자열을 포함하고 싶으면, position만 넣어도 된다.
- c++의
text.substr(3)
이 python의 text\[3:]
과 비슷한 느낌
3. 코드 및 풀이
3.1 풀이
- 우선 prefix와 suffix의 사이즈가 주어진 text의 사이즈보다 크면 무조건
"NE"
출력
- 그 후
substr()
을 활용해 문자열의 맨 앞과 문자열의 맨 끝부분을 prefix와 suffix 비교할 수 있음
#include <bits/stdc++.h>
using namespace std;
int n, pos;
string s, pre, suf, text;
int main(){
cin >> n;
cin >> s;
pos = s.find("*");
pre = s.substr(0, pos);
suf = s.substr(pos+1);
for(int i = 0; i < n; i++){
cin >> text;
if(text.size() < pre.size() + suf.size()) {
cout << "NE" << "\n";
}else{
if (text.substr(0, pre.size()) == pre && text.substr(text.size() - suf.size()) == suf) cout << "DA" << "\n";
else cout << "NE" << "\n";
}
}
return 0;
}
Reference