XHAENEUNG 질문드립니다

  • akxkdldhtm
    akxkdldhtm

    오답이 나오는 테스트 케이스를 알고 싶습니다.. 알려주시면 감사하겠습니다.

    전체 senquence는
    1)연산자및 '='의 위치를 찾고
    2)이것들의 기준으로 수식을 변환후에 정답 문자열을 얻습니다.
    3)그리고 정답 문자열과 입력된 결과를 알파벳단위로 비교합니다.

    • 글자 길이가 다르면 오답처리하고, 비교시 한번 나온 알파벳은 공백으로 제거하고 비교합니다.(CompareAlpha함수)

    더불어 코딩 자체에 대한 코멘트도 해주시면 감사하겠습니다!
    가르침이 많이 필요합니다..ㅠ_ㅠ

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct tagExPos{
        int mathpos;
        int equalpos;
        int explenth;
        char express;
    }ExpressionPos;
    
    #define MATCHED 0
    #define FIND_POS 1
    #define COUNT_ALPHA 2
    
    void FindExpPos(const char* str, ExpressionPos* pResult);
    int  WhereIsThis(const char* str, const char Token,int option);
    int  CalCulator(const char* str, ExpressionPos Result, char* str4check,char* strAnswer);
    void CopyFromTo(const char* str, char* copied, int from, int to);
    void EngtoNum(const char* str, int* num);
    int  SumAlpha(const char* str);
    int  CompareAlpha(const char* useranswer, const char* correct);
    
    int main()
    {
        int T = 0,user=0,correct=0;
        scanf("%d", &T);
    
        int* Result = (int*)malloc(sizeof(int)*T);
    
        char expression[50] = { '\0', };
        char useranswer[11] = { '\0', };
        char correctone[11] = { '\0', };
        ExpressionPos pos = { -1, -1, '\0' };
    
        for (int i = 0; i < T; i++)
        {
    
            fflush(stdin);
            scanf("%[^\n]s",expression);
            FindExpPos(expression, &pos);
            if (CalCulator(expression, pos, useranswer, correctone))
            {
                if (CompareAlpha(useranswer,correctone))
                    Result[i] = 1;
                else
                    Result[i] = 0;
            }
            else
                Result[i] = 0;
        }
    
        for (int i = 0; i < T; i++)
            printf("%s\n", Result[i] ? "Yes" : "No");
    
        free(Result);
        return 0;
    }
    
    int WhereIsThis(const char* str, const char Token,int option)
    {
        int idx = -1;
        int lenght = strlen(str);
    
        while (str[++idx] != '\0') //공백은 32, null은 0
        {
            if (str[idx] == Token)
                break;
        }
    
        if(idx >= lenght)
            return -1;
        else
            return idx;
    }
    
    void FindExpPos(const char* str, ExpressionPos* pResult)
    {
        int nTmp = -1;
    
        pResult->equalpos = WhereIsThis(str, '=',FIND_POS);
    
        if ((nTmp = WhereIsThis(str, '+', FIND_POS)) != -1)
        {
            pResult->mathpos = nTmp;
            pResult->express = '+';
        }
        else if ((nTmp = WhereIsThis(str, '*', FIND_POS)) != -1)
        {
            pResult->mathpos = nTmp;
            pResult->express = '*';
        }
        else if ((nTmp = WhereIsThis(str, '-', FIND_POS)) != -1)
        {
            pResult->mathpos = nTmp;
            pResult->express = '-';
        }
    
        pResult->explenth = strlen(str);
    
        return;
    }
    
    int CalCulator(const char* str, ExpressionPos Result, char* str4check, char* strAnswer)
    {
        int nvar1 = -1;
        int nvar2 = -1;
        int calculated = -1;
        char NumOne[10] = { '\0', };
        char Numtwo[10] = { '\0', };
    
        CopyFromTo(str, NumOne, 0, Result.mathpos - 2);
        CopyFromTo(str, Numtwo, Result.mathpos + 2, Result.equalpos-2);
    
        EngtoNum(NumOne, &nvar1);
        EngtoNum(Numtwo, &nvar2);
    
        switch (Result.express)
        {
        case '*':
            calculated = nvar1 * nvar2;
            break;
        case '+':
            calculated = nvar1 + nvar2;
            break;
        case '-':
            calculated = nvar1 - nvar2;
            break;
        }
    
        if (calculated < 0 || calculated > 10)
            return 0;
        else
        {
            CopyFromTo(str, str4check, Result.equalpos + 2, Result.explenth); //입력 답
            static char numbers[11][10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
            strcpy(strAnswer, numbers[calculated]);
        }
    
    
        return 1;
    }
    
    void CopyFromTo(const char* str, char* copied, int from, int to)
    {
        if (str == '\0')
            return;
    
        int border = to - from + 1;
        for (int i = 0; i < border; i++)
            copied[i] = str[i + from];
    
        copied[border] = '\0';
    }
    
    void EngtoNum(const char* str, int* num)
    {
        if (strcmp(str, "zero") == MATCHED)
            *num = 0;
        else if (strcmp(str, "one") == MATCHED)
            *num = 1;
        else if (strcmp(str, "two") == MATCHED)
            *num = 2;
        else if (strcmp(str, "three") == MATCHED)
            *num = 3;
        else if (strcmp(str, "four") == MATCHED)
            *num = 4;
        else if (strcmp(str, "five") == MATCHED)
            *num = 5;
        else if (strcmp(str, "six") == MATCHED)
            *num = 6;
        else if (strcmp(str, "seven") == MATCHED)
            *num = 7;
        else if (strcmp(str, "eight") == MATCHED)
            *num = 8;
        else if (strcmp(str, "nine") == MATCHED)
            *num = 9;
        else if (strcmp(str, "ten") == MATCHED)
            *num = 10;
    }
    
    int  CompareAlpha(const char* useranswer, const char* correct)
    {
        int nResult = 1,idx = 0;
        char userclone[11] = { '\0', };
        strcpy(userclone, useranswer);
    
        if (strlen(userclone) != strlen(correct))
            return 0;
    
        for (int i = 0; correct[i] != '\0'; i++)
        {
            idx = WhereIsThis(userclone, correct[i], FIND_POS);
            if (idx == -1)
                break;
    
            userclone[idx] = ' ';
        }
    
        if (idx == -1) //못 찾은게 있을 때,
            return 0;
        else
            return 1;
    }
    

    8년 전
3개의 댓글이 있습니다.
  • helloyjam
    helloyjam

    three + four = senen 한번 시도해보세요.

    정답이 nine, seven, three 등 같은 알파벳이 2회 이상나오는 단어의 경우를 테스트케이스로 시도해보시면 좋을듯합니다.


    8년 전 link
  • akxkdldhtm
    akxkdldhtm

    네 말씀해주셔서 테스트 해봤습니다. yes no가 맞게 나오는 것 같은데...
    오답이네요 ㅠ_ㅠ


    8년 전 link
  • hyunhwan
    hyunhwan

    flush(stdin);사용은 문제가 발생할 소지가 있습니다. 해당 함수를 제거하고 다시 구현해보시길 바랍니다.


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