XHAENEUNG 질문드립니다.

  • daromy
    daromy

    왜 오답인지 어떤 경우에 오답인지 모르겠네요 ㅠㅠ
    오답이 난 예제입력이 같이 출력된다면 많은 도움이 될 것 같습니다만..

    아래는 코드 설명입니다.

    1. 먼저 입력받은 2개의 operand 를 숫자로 변환합니다.
      (이 부분에서 항상 바른 operand 가 입력된다는 전제조건하에
      따로 오류처리는 하지 않고 -1 로 리턴됩니다.)

    2. 이 후 operator 에 따라 연산을 하고
      계산결과 범위가 0이상 10이하가 아닌 경우 NO 로 return 합니다.

    3. 입력되어야하는 result 값과 실제 입력된 result 값의 길이를 검사합니다.

    4. 길이가 동일하다면 알파벳 검사를 합니다.
      바른 정답의 각 char를 검색하여 발견될때마다 0으로 대체하고
      최종적으로 type casting 을 통해 sum 을 계산하여
      그 값이 0 이 아니라면 NO, 0 이라면 YES.

    ex) one + zero = neo 입력된 경우
    o 검색 -> o 자리를 0 으로 대체
    n 검색 -> n 자리를 0 으로 대체
    e 검색 -> e 자리를 0 으로 대체

    C operand 의 경우 알파벳 소문자로만 구성된 문자열임이 보장되므로
    정답이 아니라면 sum 값이 0이 될 수 없다고 판단됩니다. (음수 불가)

    #include

    char eng_number[11][6] =
    {
    "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"
    };

    int operand2int(char data[])
    {
    int i, j;
    int found = 0;

    for(i = 0; i < 11; ++i) {
        for(j = 0; eng_number[i][j] != '\0'; ++j) {
            if(data[j] == eng_number[i][j])
                found = 1;
            else {
                found = 0;
                break;
            }
        }
        if(found)
            return i;
    }
    
    return -1;

    }

    int get_result(char l_operand[], char operation, char r_operand[], char result[])
    {
    int i, j;
    int l_op = 0;
    int r_op = 0;
    int int_result = 0;
    int char_size = 0;
    int result_size = 0;
    int sum = 0;

    l_op = operand2int(l_operand);
    r_op = operand2int(r_operand);
    
    switch(operation)
    {
        case '+' : 
            int_result = l_op + r_op;
            break;
        case '-' : 
            int_result = l_op - r_op;
            break;
        case '*' : 
            int_result = l_op * r_op;           
            break;
        default : 
            break;
    }
    if(int_result < 0 || int_result > 10)
        return 0;
    
    while(eng_number[int_result][char_size++] != '\0');
    while(result[result_size++] != '\0');
    
    --char_size;
    --result_size;
    
    if(char_size != result_size)
        return 0;
    
    for(i = 0; i < char_size; ++i) {
        for(j = 0; j < char_size; ++j) {
            if(eng_number[int_result][i] == result[j]) {
                result[j] = 0;
                break;
            }
        }
    }
    
    for(i = 0; i < 11; ++i)
        sum += (int)result[i];
    
    if(sum)
        return 0;
    else
        return 1;

    }

    int main() {
    int i = 0;
    int cases = 0;
    char l_operand[6] = {0,};
    char r_operand[6] = {0,};
    char result[11] = {0,};
    char operation;

    scanf("%d", &cases);
    
    while(cases--) {
        for(i = 0; i < 11; ++i)
            result[i] = 0;
    
        scanf("%s %c %s = %s", &l_operand, &operation, &r_operand, &result);
        printf("%s\n", get_result(l_operand, operation, r_operand, result) ? "YES" : "NO");
    }
    return 0;

    }


    9년 전
1개의 댓글이 있습니다.
  • Being
    Being

    답은 Yes 또는 No이지, YES 또는 NO가 아닙니다. 다음에 코드를 올리실 때에는 구문 강조가 될 수 있도록 해 주세요.


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