알고스팟/튜토리얼
[소스코드/C++] XHAENEUNG
Makeii
2016. 3. 6. 00:00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | /*입력받은 수식이 맞게 풀어진 것인지 확인하는 프로그램을 작성하라. 대신 답은 순서에 상관없이 개수만 맞으면 정답으로 간주한다. ex) five -> vife 라도 정답처리*/ #include <iostream> #include <string> using namespace std; #define MAX_SIZE 40 int convertNum(string str); //입력받은 영단어를 숫자로 변환 string convertStr(int ans); //숫자를 영어로 변환 string check(string answer, string write); //입력받은 값과 계산한 값이 동일한지 체크 int main(){ int count; //테스트케이스 char *insert = new char[MAX_SIZE]; //입력받을 라인 string line; //연산을 수행할 문자열 int A, B; //영어로 입력받은 수를 숫자로 변환하여 저장할 변수 char operate; //산술 기호 저장할 변수 string C; //입력한 답 string answer; //연산한 결과값의 문자열 int ans; //연산한 결과값 string *result; //테스트 케이스 수 입력 cin>>count; result = new string[count]; cin.ignore(); //테스트 케이스 수만큼 for(int i=0;i<count;i++){ //산술식 입력받음 fgets(insert, MAX_SIZE, stdin); line = insert; line.pop_back(); //개행문자 삭제 //입력받은 문자열 쪼개기 //A A = convertNum(line.substr(0, line.find(" "))); line.erase(0, line.find(" ")+1); //Operate operate = line.at(0); line.erase(0, 2); //B B = convertNum(line.substr(0, line.find(" "))); line.erase(0, line.find(" ")+3); //C C = line.substr(0); //cout<<A<<" "<<operate<<" "<<B<<" "<<C<<endl; //cout<<"분리까지 OK"<<endl; //연산 switch(operate){ case 43: //+ ans = A+B; answer = convertStr(ans); break; case 45: //- ans = A-B; answer = convertStr(ans); break; case 42: //* ans = A*B; answer = convertStr(ans); break; } //cout<<"연산까지 OK"<<endl; if(ans<0||ans>10){ //결과값이 0=<C<=10이 아니라면 result[i] = "No"; } else{ //입력받은 문자열 C의 길이와 답의 길이가 같을 때만(같지 않으면 답이 아니므로 비교해볼 필요가 없음) if(C.length()==answer.length()) result[i] = check(answer, C); else result[i] = "No"; } } for(int i=0;i<count;i++){ cout<<result[i]<<endl; } //할당 해제 delete []result; delete []insert; return 0; } int convertNum(string str){ //입력받은 영단어를 숫자로 변환 //2글자만 비교하여 숫자를 판별함 char num = str.at(0); char num_same = str.at(1); switch(num){ case 122: return 0; case 111: return 1; case 116: if(num_same==119) return 2; else if(num_same==104) return 3; else return 10; case 102: if(num_same==111) return 4; else return 5; case 115: if(num_same==105) return 6; else return 7; case 101: return 8; case 110: return 9; } } string convertStr(int ans){ //숫자를 영어로 변환 switch(ans){ case 0: return "zero"; case 1: return "one"; case 2: return "two"; case 3: return "three"; case 4: return "four"; case 5: return "five"; case 6: return "six"; case 7: return "seven"; case 8: return "eight"; case 9: return "nine"; case 10: return "ten"; default : return ""; } } string check(string answer, string write){ //입력받은 값과 계산한 값이 동일한지 체크 int arr_write[26] = {0,}; //모든 값 0으로 초기화 int arr_ans[26] = {0,}; int index = 0; bool check = true; for(int i=0;i<write.length();i++){ //각 위치에 글자수 할당 arr_write[write.at(i)-97]++; arr_ans[answer.at(i)-97]++; } while(index<26){ //배열이 끝날 때까지 비교 if(arr_write[index]!=arr_ans[index]){ //같지 않은 부분이 있다면 check = false; break; } index++; } //모두 겹치면 YES, 아니면 NO if(check) return "Yes"; else return "No"; } | cs |
출력값을 올바르게 출력하지 않아 틀린 바보같은 짓을 했다..
문제를 꼼꼼히 읽고 풀자 제발 ㅠㅠㅠㅠ
처음에 답과 입력한 문자열 비교하는 것을 아스키코드의 합으로 생각했었는데 겹칠 가능성이 너무 농후해서 접었음
알파벳 갯수만큼의 배열을 생성해서 하나하나 체크하는 것이 더 나았다고 생각함
배열 초기화 방법이 for밖에 생각이 안났었는데 {0, }방식이 있다는 것을 까먹어서 삽질할 뻔했음
숫자를 영어로 변환하는 함수도 default를 넣지 않아 에러가 났었음
계산시 <0, >10 을 고려하지 않아서 생긴 실수
너무 어렵게 생각하지 말고 차근차근 생각할 것