XHAENEUNG 문제 질문드립니다!

  • wondaebal
    wondaebal

    안녕하세요.

    알고스팟에 튜토리얼 시작한지 얼마안 된 유저입니다.

    테스트 케이스와 댓글에 있던 케이스도 모두 해보니 제대로 나오는 것 같은데
    제출을 하면 오답으로 나와서 질문드립니다.

    연산의 결과가 0보다 작거나 10보다 클 경우에도 잘 걸러지는 것 같은데
    어떤 케이스에서 문제가 발생하는 알려주시면 감사하겠습니다!

    #include <stdio.h>
    #include <string>
    #include <string.h>
    
    bool flag = true;
    
    void changeCharToNumber(char* Arr, int* input)
    {
        if( !strcmp(Arr,"zero") ) *input = 0;
        else if( !strcmp(Arr,"one") ) *input = 1;
        else if( !strcmp(Arr,"two") ) *input = 2;
        else if( !strcmp(Arr,"three") ) *input = 3;
        else if( !strcmp(Arr,"four") ) *input = 4;
        else if( !strcmp(Arr,"five") ) *input = 5;
        else if( !strcmp(Arr,"six") ) *input = 6;
        else if( !strcmp(Arr,"seven") ) *input = 7;
        else if( !strcmp(Arr,"eight") ) *input = 8;
        else if( !strcmp(Arr,"nine") ) *input = 9;
        else if( !strcmp(Arr,"ten") ) *input = 10;
        else *input = -1;
    }
    char* Calculation(int fin, int sin, char* oper)
    {
        char resultString[10];
        int after=0;
        switch(*oper)
        {
        case '*' :
            after = fin * sin; 
            break;
        case '+':
            after = fin + sin; 
            break;
        case '-':
            after = fin - sin; 
            break;
        default :
            flag = false;
            break;
        }
        if( after < 0 || after > 10 ) flag = false;
        else flag = true;
    
        if( after == 0 ) strcpy(resultString, "zero");
        else if( after == 1 ) strcpy(resultString, "one");
        else if( after == 2 ) strcpy(resultString, "two");
        else if( after == 3 ) strcpy(resultString, "three");
        else if( after == 4 ) strcpy(resultString, "four");
        else if( after == 5 ) strcpy(resultString, "five");
        else if( after == 6 ) strcpy(resultString, "six");
        else if( after == 7 ) strcpy(resultString, "seven");
        else if( after == 8 ) strcpy(resultString, "eight");
        else if( after == 9 ) strcpy(resultString, "nine");
        else if( after == 10 ) strcpy(resultString, "ten");
        else flag = false;
    
        return resultString; 
    }
    
    
    int main()
    {
        int testcase=0;
        scanf("%d",&testcase);
        char first_input[11]; int finput=0;
        char second_input[11]; int sinput=0;
        char result[11]; int output=0;
        char *Calresult=NULL;
    
        char operation[2];
    
        int len_1 =0;
        int len_2 =0;
    
        char temp=NULL; char temp2=NULL;
    
        while( testcase > 0 )
        {
            scanf("%s %s %s = %s", first_input, operation, second_input, result);
    
            changeCharToNumber(first_input, &finput);
            changeCharToNumber(second_input, &sinput);
            Calresult = Calculation(finput, sinput, operation); 
    
            len_1 = strlen(Calresult);
            len_2 = strlen(result); 
    
            if( len_1 == len_2 )
            {
                for(int i=0;i<len_1;i++)
                {
                    for(int j=0;j<len_1-1;j++){
                       if( Calresult[j] > Calresult[j+1] )
                       {
                           temp =  Calresult[j];
                           Calresult[j] = Calresult[j+1];
                           Calresult[j+1] = temp; 
                       }
                        if( result[j] > result[j+1] )
                       {
                           temp2 =  result[j];
                           result[j] = result[j+1];
                           result[j+1] = temp2; 
                       }
                    }
                }
    
                if( !strcmp(result,Calresult) ) flag = true;
                else flag = false;
    
            }else flag = false;
    
    
            if( flag ) printf("Yes\n");
            else printf("No\n");
    
            testcase--;
        }
    
        return 0;
    }
    

    10년 전
4개의 댓글이 있습니다.
  • Being
    Being

    Calculation() 함수가 리턴된 후에 소멸된 지역 변수를 참조하면 안 됩니다.


    10년 전 link
  • wondaebal
    wondaebal

    답변감사합니다!
    말씀해주신대로 Calculation()함수를 아래와 같이 수정하였습니다.

    void Calculation(char* resultString, int fin, int sin, char* oper)
    {
        int after=0;
        switch(*oper)
        {
        case '*' :
            after = fin * sin; 
            break;
        case '+':
            after = fin + sin; 
            break;
        case '-':
            after = fin - sin; 
            break;
        default :
            flag = false;
            break;
        }
        if( after < 0 || after > 10 ) flag = false;
        else flag = true;
    
        if( after == 0 ) strcpy(resultString, "zero");
        else if( after == 1 ) strcpy(resultString, "one");
        else if( after == 2 ) strcpy(resultString, "two");
        else if( after == 3 ) strcpy(resultString, "three");
        else if( after == 4 ) strcpy(resultString, "four");
        else if( after == 5 ) strcpy(resultString, "five");
        else if( after == 6 ) strcpy(resultString, "six");
        else if( after == 7 ) strcpy(resultString, "seven");
        else if( after == 8 ) strcpy(resultString, "eight");
        else if( after == 9 ) strcpy(resultString, "nine");
        else if( after == 10 ) strcpy(resultString, "ten");
        else flag = false;
    }
    

    그 결과 테이스케이스는 통과하지만 여전히 오답이라고 나옵니다.
    string의 길이를 먼저 비교하고 길이가 같다면 문자열을 정렬 시켜서 strcmp를 하는 방식으로 하였는데, 혹시 제 방법이 틀린 것 인가요?


    10년 전 link
  • Being
    Being

    방법이 틀린 것은 아닙니다만, 입력으로 여러 개의 테스트 케이스가 주어질 때 기존 테스트 케이스에 대한 계산이 뒷 테스트 케이스에 영향을 미칠 수 있게끔 잘못 구현되어 있는 것 같습니다. 만약 Calculation() 함수가 문자열을 덮어씌우지 않는다면 어떻게 될까요?


    10년 전 link
  • wondaebal
    wondaebal

    감사합니다
    초기화를 통해서 해결되었네요!


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