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