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