WILDCARD 어떤 부분을 잘못 구현해서 오답 뜨는지 여쭙니다..ㅠㅠ

  • chochogogo
    chochogogo

    해당 문제 관련해서 제가 간과한 부분이 있는지 여쭙니다...ㅠㅠ
    수고하세요~

    #include <stdio.h>
    #include <malloc.h>
    
    #define MAX_WORD_LEN 100
    #define MAX_FILENAME_NUM 50
    
    typedef struct _node{
        int fileName;   //몇번째 파일 명인가
        struct _node * next;
    }Node;
    
    typedef struct _linkedList{
        Node * head;
        Node * before;
        Node * cur;
    }LinkedList;
    typedef LinkedList List;
    
    void Input(void);
    void Solve(void);
    int Compare(int idxInwildCardArr, int idxInFileNameArr, int fileNameNum);
    void SaveArrAndSort(int fileNameArrNum);
    void LInit(void);
    void LDelete(void);
    int CompareArr(int fileNameArrNum1, int fileNameArrNum2);
    void Output(void);
    
    char wildCard[MAX_WORD_LEN + 1];
    int lenOfWildCard;
    int theNumberOfFileName;
    char fileName[MAX_FILENAME_NUM][MAX_WORD_LEN + 1];
    int lenOfFileName[MAX_FILENAME_NUM];
    int dy[MAX_WORD_LEN][MAX_WORD_LEN];
    
    List list;
    
    int main(void)
    {
        int tc, T;
        freopen("input.txt", "r", stdin);
        scanf("%d", &T);
    
        for (tc = 1; tc <= T; tc++)
        {
            Input();
            Solve();
        }
    
        return 0;
    }
    
    void Solve(void)
    {
        int ret;
        int i, j, k;
    
        LInit();
    
        for (i = 0; wildCard[i] != 0; i++); lenOfWildCard = i;  //와일드 카드 문자열의 길이 저장
    
        for (i = 0; i < theNumberOfFileName; i++)
        {
            for (j = 0; fileName[i][j] != 0; j++); lenOfFileName[i] = j;    //파일명 문자열의 길이 저장
        }
    
        for (i = 0; i < theNumberOfFileName; i++)
        {
            for (j = 0; wildCard[j] != 0; j++)
                for (k = 0; fileName[i][k] != 0; k++)
                dy[j][k] = -1;
    
            ret = Compare(0, 0, i);
            if (ret == 1)
                SaveArrAndSort(i);
        }   
        Output();
        LDelete();
    }
    
    int Compare(int idxInwildCardArr, int idxInFileNameArr, int fileNameNum)
    {
        if (idxInwildCardArr >= lenOfWildCard|| idxInFileNameArr >= lenOfFileName[fileNameNum])
            return 0;
    
        if (idxInwildCardArr == lenOfWildCard - 1&&
            (wildCard[idxInwildCardArr] == '*' ||
            (lenOfFileName[fileNameNum] - 1 == idxInFileNameArr &&
            (wildCard[idxInwildCardArr] == fileName[fileNameNum][idxInFileNameArr] || wildCard[idxInwildCardArr] == '?'))))
            return 1;
    
        int &ret = dy[idxInwildCardArr][idxInFileNameArr];
        if (ret != -1)
            return ret;
    
        ret = 0;
    
        for (int i = idxInFileNameArr; i < lenOfFileName[fileNameNum]; i++)
        {
            if (wildCard[idxInwildCardArr] == fileName[fileNameNum][i] || wildCard[idxInwildCardArr] == '?')
                ret = (ret || Compare(idxInwildCardArr + 1, i+1, fileNameNum));
            else if (wildCard[idxInwildCardArr] == '*')
            {
                if (wildCard[idxInwildCardArr + 1] == '*' || wildCard[idxInwildCardArr + 1] == '?' || wildCard[idxInwildCardArr + 1] == fileName[fileNameNum][i])
                    ret = (ret || Compare(idxInwildCardArr + 1, i, fileNameNum));
            }
        }
    
        return ret;
    }
    
    void SaveArrAndSort(int fileNameArrNum)
    {
        Node * node = (Node*)malloc(sizeof(Node));
        node->fileName = fileNameArrNum;
        node->next = 0;
    
        if (list.head == 0)
            list.head = node;
        else
        {
            list.cur = list.head;
    
            while (list.cur != 0 && CompareArr(list.cur->fileName, fileNameArrNum))
            {
                list.before = list.cur;
                list.cur = list.cur->next;
            }
    
            node->next = list.cur;
            if (list.cur == list.head)
                list.head = node;
            else
                list.before->next = node;
        }       
    }
    
    /*
    문자열 정렬 시, fileNameArrNum1가 사전순으로 더 빠르면 1, 아니면 0반환
    */
    int CompareArr(int fileNameArrNum1, int fileNameArrNum2)
    {
        for (int i = 0; i < lenOfFileName[fileNameArrNum1]; i++)
        {
            if (i >= lenOfFileName[fileNameArrNum2])
                return 0;
            if (fileName[fileNameArrNum1][i] < fileName[fileNameArrNum2][i])
                return 1;
            else if (fileName[fileNameArrNum1][i] > fileName[fileNameArrNum2][i])
                return 0;
        }
        return 1;
    }
    
    void LInit(void)
    {
        list.head = 0;  //링크드리스트 초기화
        list.before = 0;
        list.cur = 0;
    }
    void LDelete(void)
    {
        Node * delNode;
        Node * nextDelNode;
    
        delNode = list.head;
    
        while (delNode != 0)
        {
            nextDelNode = delNode->next;
            free(delNode);
            delNode = nextDelNode;
        }
    }
    
    void Output(void)
    {
        list.cur = list.head;
    
        while (list.cur != 0)
        {
            printf("%s\n", fileName[list.cur->fileName]);
            list.cur = list.cur->next;
        }
    }
    
    void Input(void)
    {
        scanf("%s", wildCard);
        scanf("%d", &theNumberOfFileName);
        for (int i = 0; i < theNumberOfFileName; i++)
            scanf("%s", fileName[i]);
    }
    

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