WILDCARD 질문입니다~!

  • Signin
    Signin

    안녕하세요~
    WildCard 문제를 계속 풀다가,
    오답이 계속 나서 여쭈어봅니다.

    Memoization을 배우는 단원이지만
    일단은 풀어보고 나서 메모이제이션을 적용시키려는 생각으로
    아직은 일일이 계산만 하는 코드를 작성했습니다.

    TLE가 나기를 바라면서 코드를 제출했는데
    매번 오답 판정이 뜨네요ㅠㅠ.

    혹시 무엇이 문제인지 알 수 있을까요~~?
    알려주시면 감사하겠습니다~!

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    bool match(string w, string f, int w_i, int f_i);
    void sortString(string v[], int n);
    
    int main(void)
    {    
        int numOfTestCases;
        cin >> numOfTestCases;
    
        for(int i=0; i<numOfTestCases; i++)
        {
            string wildCard;
            cin >> wildCard;
    
            int n;
            cin >> n;
    
            string *fileName = NULL;
            fileName = new string[n];
    
    
    
            for(int j=0; j<n; j++)
            {
                cin >> fileName[j];
            }
    
            sortString(fileName, n);
    
    
            for(int k=0; k<n; k++)
            {
                if(match(wildCard, fileName[k], 0, 0))
                    cout << fileName[k] << endl;
            }
    
        }
    
        return 0;
    }
    
    
    // 현재 주어진 위치에서부터, 두 문자열이 매칭되는지를 반환한다.
    // w_i 는 현재 w에서 matching 중인 글자의 index. (f_i도 f에서~)
    bool match(string w, string f, int w_i, int f_i)
    {
        bool matched = true;
    
        int wsize = w.size();
        int fsize = f.size();
    
        while( w_i < wsize && f_i < fsize )
        {
    
            if (w[w_i] == '?')      // 1. 물음표일 때
            {
                w_i++;
                f_i++;
            }
    
            else if (w[w_i] == '*')     // 2. 별표일 때.
            {
    
    
                while((w_i < wsize) && (w[w_i] == '*'))
                    w_i++;
    
    
                vector<bool> cases;
                for(int k=f_i; k<fsize; k++)
                {
                    cases.push_back(match(w, f, w_i, k));
                }
    
                for(int k=0; k<cases.size(); k++)
                {
                    if(cases[k]) return true;
                }
    
            }
    
            else if (w[w_i] != f[f_i])      // 3. 매칭이 안 될 때 -> 자동 False.
            {
                return false;
            }
    
            else                        // 매칭될 때 -> 다음 글자를 찾는다.
            {
                w_i++;
                f_i++;
            }
    
        }
    
        if( w_i == wsize && f_i == fsize )      // 매칭이 된 경우.
            return true;
    
        else if(w_i < wsize && f_i == fsize)    // fileName이 먼저 끝난 경우
        {
            for(int i=w_i; i<wsize; i++)        // w의 남은 문자들이 모두 *이면 true, 아니면 false
            {
                if(w[w_i] != '*')
                    return false;
            }
    
            return true;
        }
    
        else if (w_i == wsize && f_i < fsize)   // wildCard가 먼저 끝난 경우.
        {
            if(w[wsize-1] == '*')               // w의 마지막 문자가 *이면 true, 아니면 false.
                return true;
    
            return false;
        }
    
    
        return false;
    }
    
    
    // 문자열을 정렬한다.
    void sortString(string v[], int n)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=n-1; j>i; j--)
            {
                if(v[j].compare(v[j-1]) == -1)
                {
                    v[j].swap(v[j-1]);
                }
            }
        }
    }
    


    11년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.