2017 카카오 신입공채 1차 테스트 2번 문제
이번에는 2번 문제 풀이 입니다.
문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다.
문제에 대한 상세 설명은 카카오블로그를 참조 바랍니다.
2번 문제는 C++ 11에 새롭게 추가된 정규표현식을 이용해서 만들어 보았습니다
문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다.
문제에 대한 상세 설명은 카카오블로그를 참조 바랍니다.
2번 문제는 C++ 11에 새롭게 추가된 정규표현식을 이용해서 만들어 보았습니다
#include#include #include 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; }
댓글
댓글 쓰기