튜토리얼 XHAENEUNG에 대해 질문드립니다.

  • ihl
    ihl

    제출하면 런타임 오류가 나는데 왜 그런지 잘 모르겠어서 질문드립니다;;;
    해당 문제의 댓글에 있는 예제는 모두 넣어 보았습니다.

    문제는 0~10까지 연산과 답을 문자열로 주었을 때 올바른 답인지 체크하는 문제입니다. 예를들어
    two + three = ivef 라고 입력이 오면
    답은 five이지만, five와 같은 순서만 다른 같은 문자열도 맞게 처리되므로 Yes가 출력되는 것입니다.

    <a class="problem" href="/judge/problem/read/XHAENEUNG" title="째능 교육">XHAENEUNG</a>

    https://algospot.com/judge/problem/read/XHAENEUNG

    저는 다음과 같은 과정으로 문제를 풀려 했습니다.

    1. 주어진 문자열을 공백과 =을 기준으로 잘라 저장한다.
      ->자르면 문자로된 숫자 3개와 연산기호가 남고 이를 저장.

    2. 잘린 문자중 앞의 2개는 문제의 숫자로, 정확한 값이다. 이를stringTonumber()함수에 의해 정수로 바꾼다.
      -전역으로 선언된 char* num[11]과 for문 비교

    3. stringTonumber()함수로 바꾼 정수들을 calcString()을 계산
      -계산시 10이 넘을 경우 무조건 11을 리턴
      -11의 경우 getResult()를 거치지 않고 바로 "No"

    4. getResult()함수로 올바른 답과 입력된 답(마지막 문자 숫자)을 비교하여 채점한다.
      -입력된 답 한 글자와 올바른 답의 모든 글자를 2중 반복문으로 비교하여 같은 문자의 수가 올바른 답의 길이와 같다면 "Yes"

    #include<stdio.h>
    #include<string.h>
    #include <stdlib.h>
    
    char* num[] = {"zero","one","two","three","four","five","six","seven","eight","nine","ten","xxx"};
    
    int stringTonumber(char* x) {//문자열을 데이터로 바꾸는 함수
        int i,n;
        for (i = 0; i < 11;i++) {
            if (strcmp(x, num[i]) == 0)
                n = i;
        }
        return n;
    }
    
    int calcString(int x, char* op, int y) {//계산
        int answer;
        if (strcmp(op, "+") == 0) {
            answer = x + y;
        }
        else if (strcmp(op, "-") == 0) {
            answer = x - y;
        }
        else if (strcmp(op, "*") == 0) {
            answer = x * y;
        }
        if (answer > 10)
            answer = 11;
        return answer;
    }
    
    void getResult(char* x, char* answer) {//채점
        int i,j;
        int count=0;
        //int count2 = 0;
        int bs = 0;
        for (i = 0; i < strlen(answer); i++) {
            bs = 0;
            for (j = 0; j < strlen(x)&&bs==0; j++) {
                if (answer[i] == x[j]) {
                    bs++;
                    count++;
                }
            }
        }
    
        if (count == strlen(x))
            printf("Yes\n");
        else
            printf("No\n");
    }
    
    int main() {
    
        int t;
        int i,j;
        char s[27];//문제
        char * token;//잘린 토큰
        char word[5][11];
        char answer[11];
    
        scanf("%d", &t);
    
        getchar();
        //fflush(stdin);
    
        for (i = 0; i < t;i++) {
            j = 0;
            fgets(s,sizeof(s),stdin);
            s[strlen(s) - 1] = '\0';
            token = strtok(s, " =");//1. 토큰으로 자르기
            while (token != NULL) {
                strcpy(word[j], token);//자른 단어를 저장
                token = strtok(NULL, " =");
                j++;
            }
            strcpy(answer, num[calcString(stringTonumber(word[0]), word[1], stringTonumber(word[2]))]);//연산의 올바른 답
            if (strcmp(answer, num[11]) == 0)
                printf("No\n");
            else
                getResult(word[3], answer);
        }
        return 0;
    }
    

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