# 본인 코드
#include <bits/stdc++.h>
using namespace std;
int n;
string p;
string f[100];
// 패턴 *기준 스플릿한 스트링 벡터
vector<string> pstr;
vector<string> split(string input, string separator){
vector<string> result;
long long pos = 0;
string token;
while ((pos = input.find(separator)) != string::npos){
token = input.substr(0, pos);
result.push_back(token);
input.erase(0, pos + separator.length());
}
result.push_back(input);
return result;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
string bufferflush;
getline(cin, bufferflush);
getline(cin, p);
pstr = split(p, "*");
for (int i = 0; i < n; i++){
getline(cin, f[i]);
}
// 반례 1. 서브스트링 길이가 입력 문자열보다 길때 - 컴파일에러 발생 - 해결 후 65%
// 반례 2. 패턴에 빈 문자열이 들어가는 것이 아니라 입력 내에 빈 문자열이 포함
// 반례 3. 패턴 문자열 자체가 비어있는 경우 Ex) *adb - 오른쪽문자열만 있으면 패턴 통과
for (int i = 0; i < n; i++){
// 패턴문자열 한쪽이 비어있을때 - 하나만 검사해서 맞으면 DA
if(pstr[0].length() == 0 && pstr[1].length() != 0 && pstr[1] == f[i].substr(f[i].length() - pstr[1].length(), pstr[1].length())){
cout << "DA"
<< "\n";
continue;
}else if(pstr[1].length() == 0 && f[i].find(pstr[0]) == 0){
cout << "DA"
<< "\n";
continue;
// 패턴문자열 둘다 비어있으면 - 무조건 통과
}else if(pstr[0].length() == 0 && pstr[1].length() == 0){
cout << "DA"
<< "\n";
}
if(pstr[0].length() + pstr[1].length() > f[i].length()){
cout << "NE"
<< "\n";
continue;
}
// 서브트링 길이가 입력 문자열보다 긴 경우 - NE 출력
if (f[i].length() < pstr[0].length() || f[i].length() < pstr[1].length())
{
cout << "NE"
<< "\n";
continue;
}
// 메인로직
if(pstr[1] == f[i].substr(f[i].length() - pstr[1].length(), pstr[1].length()) && f[i].find(pstr[0]) == 0){
cout << "DA" << "\n";
}else{
cout << "NE"
<< "\n";
}
}
return 0;
}
- split을 써서 별표 기준으로 패턴 문자열을 분리하여 벡터에 저장했다.
- 메인로직은 split된
pstr[0]
을 입력문자열f[i]
의 0번째 인덱스부터 find를 하고,pstr[1]
을 입력문자열f[i]
의 마지막 인덱스로부터pstr[1].length()
를 빼준 인덱스부터 동일한지 여부를 검사한다. - cin 과정에서 발생하는 공백문자 관련하여 getline 버퍼플래시도 진행했다.
- 나머지 반례를 고려한다.
- 서브스트링 각각이 입력문자열보다 길이가 긴 경우,
ab*cd
인데 입력 문자열이a
이면 서브스트링 과정에서 런타임 에러가 발생한다. - 패턴문자열 길이가 0인 경우도 고려했다.
*
로 입력된 경우 무조건 DA를 출력했고, 왼쪽 또는 오른쪽만*ab
,ab*
와 같이 입력된 경우 이에 해당하는 로직을 추가하였다. - 이 부분은 놓친 반례인데, 패턴문자열 길이의 총 합이 입력문자열보다 긴 경우는 반드시 NE를 출력해야 한다. 패턴문자열 각각의 길이에 대해서만 고려하면
ab*ab
가 최소abab
입력 문자열에 대해서만 검사를 해야하는데 split된 패턴문자열ab
각각에 대해서만 검사를 하게 된다.
- 서브스트링 각각이 입력문자열보다 길이가 긴 경우,
# 개선 코드
#include <bits/stdc++.h>
using namespace std;
int n;
string s, ori_s, prefix, suffix;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
cin >> ori_s;
int pos = ori_s.find('*');
prefix = ori_s.substr(0, pos);
suffix = ori_s.substr(pos + 1);
for (int i = 0; i<n; i++){
cin >> s;
if(prefix.size() + suffix.size() > s.size()){
cout << "NE\n";
}else{
if(prefix == s.substr(0, prefix.size()) && suffix == s.substr(s.size() - suffix.size())){
cout << "DA\n";
}else{
cout << "NE\n";
}
}
}
return 0;
}
- prefix-suffix 문자열을 split하지 않고
*
문자를 먼저 찾아 서브스트링 메서드로 분리하였다. - 그 외에는 불필요하게 고려한 반례들로 생각됨.