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

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

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

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

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>

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

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