[C++] ALGOSPOT : XHAENEUNG


Image 9

문자열을 숫자로 변환 하는것 까진 쉬웠는데

ivef 같은것도 five로 인식하기 위한 방법이 처음엔 잘 떠오르지 않아서

 

문자열의 charsum (각 문자의 값을 더한 것) 과 문자의 갯수를 비교하였는데

이건 잘못된 approach 였다.

 

뭐 ivef 이런걸 five로 인식하는것 까진 가능했기에 왜 정답이 아니라는거지? 하고 생각을 해보니,  같은 character 갯수에 같은 charsum 일 가능성도 있던것. 예: jvdf

 

젠장! 그래서 그냥 문제에서 원하는 그대로 해결하였다

주어진 문자열에서 정답의 문자열에있는 각 문자열을 찾아서 지워버린다음에,

결과가 공백이면 정답처리하게 하니까 성공!

#include <iostream>
#include <string>
#include <vector>

using namespace std;

const string num[11] = {
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
    "ten"
};

int str_to_int(string str){
    int n = 0;
    for(int i = 0; i < str.length(); i++){
        n += str.at(i);
    }
    return n;
}

vector<string> split(string str, string delim){
    vector<string> v;
    int pos=0;
    int left=0;
    while((pos=str.find(delim,pos))!=string::npos){
        string s;
        s = str.substr(left, pos-left);
        v.push_back(str.substr(left, pos-left));
 
        // left = pos + s.length();
         pos = pos + delim.length();
         left = pos;
    }

    if(left>0){
        v.push_back(str.substr(left, str.length()-left));
    }
    return v;
}

class Equation{
    public:
       string equation;
       string operand_left;
       string operand_right;
       string operator_type;
       string given_answer;
       Equation(void);
       Equation(string equation);
       void process();
       bool validate();
       // int str_to_charsum(string str);
       int str_to_int(string str);
};

Equation::Equation(void){
    equation = "";
}

Equation::Equation(string equation){
    this->equation = equation;
    this->process();
}

void Equation::process(){
    vector<string> v = split(equation, " ");
    operand_left = v[0];
    operator_type = v[1];
    operand_right = v[2];
    given_answer = v[4];
}

/* FIRST APPROACH

bool Equation::validate(){

    int left, right, ans;
    int sum, ans_sum;

    left = str_to_int(operand_left);
    right = str_to_int(operand_right);
    sum = str_to_charsum(given_answer);
    if(operator_type=="+"){
        ans = left + right;    
    }else if(operator_type=="-"){
        ans = left - right;
    }else{
        ans = left * right;
    }

    if(ans>10||ans<0){
        return 0;
    }
    ans_sum = str_to_charsum(num[ans]);

    if((sum==ans_sum)&&(given_answer.length()==num[ans].length())){
        return 1;
    }else{
        return 0;
    } 
    
}

*/

bool Equation::validate(){

    int left, right, ans;
    int sum, ans_sum;

    left = str_to_int(operand_left);
    right = str_to_int(operand_right);
    
    if((left==-1)||(right==-1))
        return 0;

    if(operator_type=="+"){
        ans = left + right;    
    }else if(operator_type=="-"){
        ans = left - right;
    }else{
        ans = left * right;
    }

    if(ans>10||ans<0){
        return 0;
    }
    
    if(given_answer.length()!=num[ans].length())
        return 0;

    int pos = 0;
    string s = given_answer;

    for(int i=0; i<num[ans].length(); i++){
        char c = num[ans].at(i);
        if((pos = s.find(c)) != string::npos)
            s.erase(pos, 1);
    }

    return (s.length()==0);
    
}

int Equation::str_to_charsum(string str){ 
    int n = 0;
    for(int i = 0; i < str.length(); i++){
        n += str.at(i);
    }
    return n;
}

int Equation::str_to_int(string str){
    int n = -1;
    for(int i=0; i<11; i++){
        if(str==num[i]){
            n = i;
            break;
        }
    }    

    return n;
}

int main(){
    int t;
    vector<Equation> v;
    cin >> t;
    cin.ignore();
    for(int i=0; i<t; i++){
        string input;
        getline(cin, input);
        Equation e(input);
        v.push_back(e);
    }

    for(Equation e : v){
        if(e.validate())
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
}