2017 카카오 신입공채 1차 테스트 2번 문제
이번에는 2번 문제 풀이 입니다.
문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다.
문제에 대한 상세 설명은 카카오블로그를 참조 바랍니다.
2번 문제는 C++ 11에 새롭게 추가된 정규표현식을 이용해서 만들어 보았습니다
문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다.
문제에 대한 상세 설명은 카카오블로그를 참조 바랍니다.
2번 문제는 C++ 11에 새롭게 추가된 정규표현식을 이용해서 만들어 보았습니다
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 | #include<iostream> #include<string> #include<regex> using namespace std; // 다트 점수 3회 const int n = 3; enum DARTITEM {DART_SCORE, DART_BONUS, DART_OPTION}; struct dartResult { int score; char bonus; char option; }; void tokenizing(string str, regex reg, DARTITEM item, dartResult dart[]); void print(dartResult dart[]); void calcscore(dartResult dart[]); int main() { while (1) { string str; cout << "다트 결과 문자열을 입력하세요 (종료는 0) : " ; getline(cin, str, '\n' ); if (str == "0" ) break ; regex score( "((10|[0-9])[S|D|T][*|#]?)+" ); if (regex_match(str, score)) { dartResult dart[n]; for ( int i = 0; i < n; i++) { dart[i].score = 0; dart[i].bonus = 0; dart[i].option = 0; } tokenizing(str, regex( "(10|[0-9])" ), DART_SCORE, dart); tokenizing(str, regex( "[S|D|T]" ), DART_BONUS, dart); tokenizing(str, regex( "[0-9][S|D|T][*|#]?" ), DART_OPTION, dart); print(dart); calcscore(dart); } else { cout << "입력 형식 오류" << endl; } } return 0; } void tokenizing(string str, regex reg, DARTITEM item, dartResult dart[]) { sregex_iterator itr(str.begin(), str.end(), reg); sregex_iterator end; int k = 0; for (sregex_iterator i = itr; i != end; ++i) { smatch match = *i; switch (item) { case DART_SCORE: dart[k].score = atoi (match.str().c_str()); break ; case DART_BONUS: dart[k].bonus = match.str()[0]; break ; case DART_OPTION: if (match.str()[match.str().size() - 1] == '*' || match.str()[match.str().size() - 1] == '#' ) { dart[k].option = match.str()[match.str().size() - 1]; } break ; } k++; } } void print(dartResult dart[]) { for ( int i = 0; i < n; i++) { cout << i + 1 << "점수 : " << dart[i].score << endl; cout << i + 1 << "보너스 : " << dart[i].bonus << endl; if (dart[i].option == '*' || dart[i].option == '#' ) { cout << i + 1 << "옵션 : " << dart[i].option << endl; } cout << endl; } } void calcscore(dartResult dart[]) { int sum[n]; for ( int i = 0; i < n; i++) { sum[i] = 0; sum[i] = dart[i].score; switch (dart[i].bonus) { case 'S' : break ; case 'D' : sum[i] = sum[i] * sum[i]; break ; case 'T' : sum[i] = sum[i] * sum[i] * sum[i]; break ; } switch (dart[i].option) { case '*' : sum[i] = sum[i] * 2; if (i > 0) { sum[i - 1] = sum[i - 1] * 2; } break ; case '#' : sum[i] = sum[i] * (-1); break ; } } int totalscore = 0; for ( int i = 0; i < n; i++) { cout << i + 1 << " 번 점수 : " << sum[i] << endl; totalscore += sum[i]; } cout << endl; cout << "*종합 점수 : " << totalscore << endl << endl; } </regex></string></iostream> |
댓글
댓글 쓰기