XHAENEUNG 왜 오답이 나오는지 모르겠어요

  • AlgoPigeon
    AlgoPigeon
    • 함수 설명
    1. toNum(): 영문으로 된 string 타입 피연산자를 인풋으로 받고, 영어에 해당하는 int 타입의 숫자로 리턴

    2. toEng(): int 타입 연산결과(정답)를 인풋으로 받고, 숫자에 대응하는 영어를 구성하는 알파벳을 인덱스로 int countEng[]의 원소값을 1 증가시키는 방법으로 카운팅

    3. isCorrect(): toEng()로 정답을 구성하는 알파벳을 카운팅한 결과로 만들어진 int countEng[] 배열에 대해, 콘솔에 사용자가 입력한 연산결과(string 타입)를 구성하는 알파벳에 해당하는 배열원소를 -1 한다. 그런다음 int countEng[]의 모든 원소가 0인지 확인하고 0이라고 true를, 아니라면 false를 반환.

    말로 설명하자니 장황해졌는데 코드 보시면 아시겠지만 정말 단순하게 짰습니다. 댓글에 달린 예제들도 돌려보고 잘 동작하는 것을 확인했는데 제출해보면 오답이 나옵니다ㅜㅜ 아래에 코드를 첨부합니다.

    #include <iostream>
    #include <string>
    #include <cstring>
    
    using namespace std;
    
    int toNum(string x);
    void toEng(int x);
    bool isCorrect(string input);
    
    int countEng[26] = { 0 };
    enum Alphabet { a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z };
    enum Alphabet myAlphabet;
    
    int main(void) {
        int t;
        string a, b, answer;
        char op, is;
        int result;
        cin >> t;
    
        while (t--) {
            result = -1;
            memset(countEng, 0, 26*sizeof(int));
            cin >> a;
            cin >> op;
            cin >> b;
            cin >> is;
            cin >> answer;
            switch (op) {
            case '+':
                result = toNum(a) + toNum(b);
                break;
            case '-':
                result = toNum(a) - toNum(b);
                break;
            case '*':
                result = toNum(a) * toNum(b);
                break;
            default:
                break;
            }
            if (result > 10 || result < 0) {
                cout << "No" << endl;
                continue;
            }
            toEng(result);
            if (isCorrect(answer)) cout << "Yes" << endl;
            else cout << "No" << endl;
    
        }
    }
    
    int toNum(string x) {
        if (x == "zero") {
            return 0;
        }
        if (x == "one") {
            return 1;
        }
        if (x == "two") {
            return 2;
        }
        if (x == "three") {
            return 3;
        }
        if (x == "four") {
            return 4;
        }
        if (x == "five") {
            return 5;
        }
        if (x == "six") {
            return 6;
        }
        if (x == "seven") {
            return 7;
        }
        if (x == "eight") {
            return 8;
        }
        if (x == "nine") {
            return 9;
        }
        if (x == "ten") {
            return 10;
        }
    }
    
    void toEng(int x) {
        switch (x) {
        case 0:
            countEng[z]++;
            countEng[e]++;
            countEng[r]++;
            countEng[o]++;
            break;
        case 1:
            countEng[o]++;
            countEng[n]++;
            countEng[e]++;
            break;
        case 2:
            countEng[t]++;
            countEng[w]++;
            countEng[o]++;
            break;
        case 3:
            countEng[t]++;
            countEng[h]++;
            countEng[r]++;
            countEng[e]++;
            countEng[e]++;
            break;
        case 4:
            countEng[f]++;
            countEng[o]++;
            countEng[u]++;
            countEng[r]++;
            break;
        case 5:
            countEng[f]++;
            countEng[i]++;
            countEng[v]++;
            countEng[e]++;
            break;
        case 6:
            countEng[s]++;
            countEng[i]++;
            countEng[x]++;
            break;
        case 7:
            countEng[s]++;
            countEng[e]++;
            countEng[v]++;
            countEng[e]++;
            countEng[n]++;
            break;
        case 8:
            countEng[e]++;
            countEng[i]++;
            countEng[g]++;
            countEng[h]++;
            countEng[t]++;
            break;
        case 9:
            countEng[n]++;
            countEng[i]++;
            countEng[n]++;
            countEng[e]++;
            break;
        case 10:
            countEng[t]++;
            countEng[e]++;
            countEng[n]++;
            break;
        default:
            break;
        }
    }
    
    bool isCorrect(string input) {
        char tmp;
        for (int i = 0; i < (int)input.size(); i++) {
            tmp = input.at(i);
            countEng[tmp - 'a' ]--;
        }
        for (int i = 0; i < 26; i++) {
            if (countEng[i] != 0) return false;
        }
        return true;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • seico75
    seico75

    toEng 함수의 인자가 x 인데, 알파벳 x와 겹치네요..
    x=6일 경우 countEng[23]++ 이 되어야 하는데 x 변수값으로 countEng[6]++ 이 되는 문제가 있습니다.
    enum 을 저런식으로 하는 것은 위험한 방법이네요..


    8년 전 link
  • AlgoPigeon
    AlgoPigeon

    감사합니다. 그 부분을 수정하니까 정답 처리되네요!
    이런 단순한 방법말고 정렬이라던가 다른 방법으로도 풀어봐야겠습니다


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