문자열을 숫자로 변환 하는것 까진 쉬웠는데
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; } }