2017 카카오 신입공채 1차 테스트 2번 문제

이번에는 2번 문제 풀이 입니다. 

문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다.

문제에 대한 상세 설명은 카카오블로그를 참조 바랍니다.

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;
}

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기