# 본인 코드

#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;
}
  1. split을 써서 별표 기준으로 패턴 문자열을 분리하여 벡터에 저장했다.
  2. 메인로직은 split된 pstr[0]을 입력문자열 f[i]의 0번째 인덱스부터 find를 하고, pstr[1]을 입력문자열 f[i]의 마지막 인덱스로부터 pstr[1].length()를 빼준 인덱스부터 동일한지 여부를 검사한다.
  3. cin 과정에서 발생하는 공백문자 관련하여 getline 버퍼플래시도 진행했다.
  4. 나머지 반례를 고려한다.
    • 서브스트링 각각이 입력문자열보다 길이가 긴 경우, 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;
}
  1. prefix-suffix 문자열을 split하지 않고 * 문자를 먼저 찾아 서브스트링 메서드로 분리하였다.
  2. 그 외에는 불필요하게 고려한 반례들로 생각됨.