포커용 카드는 52개의 카드로 이루어진다. 각 카는 클럽, 다이아몬드, 하트, 스페이드 ( 입력데이터에서는 C,D,H,S 로 표기 ) 의 값을 갖는다. 점수를 매길 때 위에 열거한 순서대로 등급이 매겨지며 2가 가장 낮고 에이스가 가장 높다. 무늬는 값에 영향을 끼치지 않는다.
포커 패는 다섯 장의 카드로 구성되며 다음과 같은 순서대로 등급이 매겨진다.
하이 카드 : 아래에 있는 것 가운데 어떤 범주에도 속하지 않는 패는 그 중 가장 높은 카드의 값에 따라 등급이 매겨진다. 가장 높은 카드의 값이 같으면 그 다음 카드, 그 다음 카드도 같으면 그 다음 카드, 이런 식으로 등급이 매겨진다.
원 페어 : 다섯 장의 카드 가운데 두 장이 같은 경우. 같은 원 페어끼리 맞붙는 경우에는 더 높은 값을 가지는 원 페어 패에 더 높은 등급이 매겨진다. 값까지 같은 경우에는 나머지 카드의 값에 의해 더 높은 패가 결정된다.
투 페어 : 두 쌍의 카드가 같은 값을 가지는 경우, 투 페어끼리 맞붙는 경우에는 그 중 더 높은 페어의 값에 의해 더 높은 등급이 매겨진다. 두 쌍의 값이 모두 같으면 남은 카드에 의해 더 높은 패가 결정된다.
쓰리 카드 : 다섯장 가운데 세 장이 같은 값을 가지는 경우. 쓰리 카드끼리 맞붙는 경우에는 세장의 같은 값을 가지는 카드의 값에 의해 더 높은 패가 결정된다.
스트레이트: 다섯 장의 카드가 연속적인 값을 가지는 경우. 스트레이트끼리 맞붙을 경우에는 가장 높은 카드에 의해 더 높은 패가 결정된다.
플러시 : 다섯 장의 카드의 무늬가 모두 같은 경우, 플러시끼리 맞붙을 경우에는 하이 카드의 규칙에 따라서 더 높은 패가 결정된다.
풀 하우스 : 세 장의 카드가 같은 값을 가지고 나머지 두 장의 카드가 같은 값을 가지는 경우. 같은 값을 가지는 세장의 카드의 우열에 의해 더 높은 패가 결정된다.
포 카드 : 네 장의 카드가 같은 값을 가지는 경우. 포카드끼리 맞붙는 경우에는 네 장의 같은 값을 가지는 카드의 값에 의해 더 높은 패가 결정된다.
스트레이트 플러시 : 다섯 장의 카드가 무늬가 같으면서 모두 연속적인 값을 가지는 경우. 패에 있는 것 중 가장 높은 카드에 의해 더 높은 패가 결정된다.
몇 쌍의 포커패를 비교, 어느쪽이 이겼는지 아니면 무승부인지 알아내자.
입력
입력 파일은 여러 줄로 구성되며 각 줄에는 열 장의 카드를 나타내는 값이 들어간다. 앞에 있는 다섯 장의 카드는 "Black"이라는 참가자의 카드고 뒤에 있는 다섯장의 카드는 "White"라는 참가자의 카드다.
출력
입력된 각 줄에 대해 다음 중 한 가지가 들어있는 행을 출력한다.
Black wins.
White wins.
Tie.
입력 예
2H 3D 5S 9C KD 2C 3H 4S 8C AH
2H 4S 4C 2D 4H 2S 8S AS QS 3S
2H 3D 5S 9C KD 2C 3H 4S 8C KH
2H 3D 5S 9C KD 2D 3H 5C 9S KH
출력 예
White wins.
Black wins.
Tie.
Tie.
포커를 몰라서 이거 입력 예를 문자로 봐도 잘 모르겠다..;;
책의 출력예가 틀린 것 같아 고쳤다. 4개의 답이 맞는지 확인해 주시기 바란다.
예를 들어, 첫번째 게임이 책에선 Tie라고 나와있었는데, 두 패다 하이 카드고 white에게 A패가 있으므로 white가 승리하는게 맞는 것으로 보인다.
더보기
접기
1#include < iostream >
2 using namespace std;
3
4 int returnNum[ 2 ] = ... { 0 ,} ;
5 int returnNum_W[ 2 ] = ... { 0 ,} ;
6
7 class PAE ... {
8
9 private :
10
11 char shape; // C D H S
12
13 int Num; // 2,3,....9
14
15 public :
16
17
18 PAE()... {
19
20 this -> shape = ' B ' ;
21 this -> Num = 0 ;
22
23 }
24
25 void setN( int Num) ... {
26
27 this -> Num = Num;
28 }
29 void setPAE( char shape, int Num) ... {
30 this -> shape = shape;
31 this -> Num = Num;
32 }
33 char getPAE_S() ... {
34 return shape;
35 }
36 int getPAE_N() ... {
37 return Num;
38 }
39
40 };
41
42 int PAE_Rule(PAE examine[ 5 ], int );
43 // 1~ 9 점수. 9가 스트레이트 플러시. 1이 하이카드
44
45 int main() ... {
46
47 while ( 1 ) ... {
48
49 char shape;
50 int Num = 0 ;
51 PAE Black[5 ];
52 PAE White[5 ];
53
54 for ( int i = 0 ; i < 5 ; i ++ ) ... {
55
56 char oneCard[ 3 ];
57
58 cin>> oneCard;
59 shape = oneCard[ 1 ];
60
61
62 switch (oneCard[ 0 ]) ... {
63 case ' T ' :
64 Num = 10 ;
65 break ;
66 case ' J ' :
67 Num = 11 ;
68 break ;
69 case ' Q ' :
70 Num = 12 ;
71 break ;
72 case ' K ' :
73 Num = 13 ;
74 break ;
75 case ' A ' :
76 Num = 14 ;
77 break ;
78
79 default :
80 Num = oneCard[ 0 ] - 48 ;
81 }
82
83
84 Black[i].setPAE(shape,Num);
85 }
86
87 for ( int i = 0 ; i < 5 ; i ++ ) ... {
88
89 char oneCard[ 3 ];
90
91 cin>> oneCard;
92
93 shape = oneCard[ 1 ];
94
95 switch (oneCard[ 0 ]) ... {
96 case ' T ' :
97 Num = 10 ;
98 break ;
99 case ' J ' :
100 Num = 11 ;
101 break ;
102 case ' Q ' :
103 Num = 12 ;
104 break ;
105 case ' K ' :
106 Num = 13 ;
107 break ;
108 case ' A ' :
109 Num = 14 ;
110 break ;
111
112 default :
113 Num = oneCard[ 0 ] - 48 ;
114 }
115
116 White[i].setPAE(shape,Num);
117 }
118
119 // 패 생성 끝
120
121 int B_point ;
122 int W_point ;
123
124 B_point = PAE_Rule(Black, 1 );
125 W_point = PAE_Rule(White, 2 );
126
127 if (B_point > W_point || (B_point == W_point) && (returnNum[ 1 ] > returnNum_W[ 1 ]))
128 cout<< " Black wins " << endl;
129 else if (B_point < W_point || (B_point == W_point) && (returnNum[ 1 ] < returnNum_W[ 1 ]))
130 cout<< " White wins " << endl;
131
132 else
133 cout<< " Tie " << endl;
134
135
136 }// while1
137 return 0 ;
138 }
139
140 int PAE_Rule(PAE examine[ 5 ], int who) ... {
141
142 /**/ /// sequence count
143
144 int sequenceNum = 1 ;
145 int sameShapeNum = 0 ;
146 int biggerOne = 0 ;
147 bool already_apear = false ;
148 int shape[ 4 ] = ... { 0 ,} ;
149 int numfre[ 15 ] = ... { 0 ,} ;
150
151 int temp;
152 char temp2;
153
154 for ( int i = 0 ; i < 5 ; i ++ ) ... {
155 int num = examine[i].getPAE_N();
156 numfre[num]++ ;
157 }
158
159 for ( int i = 0 ; i < 5 ; i ++ ) ... {
160
161 for ( int j = i + 1 ; j < 5 ; j ++ ) ... {
162 if (examine[i].getPAE_N() > examine[j].getPAE_N()) ... {
163
164 temp = examine[i].getPAE_N();
165 temp2 = examine[i].getPAE_S();
166 examine[i].setPAE(examine[j].getPAE_S(),examine[j].getPAE_N());
167 examine[j].setPAE(temp2,temp);
168 }
169 }
170 }
171
172 // for(int i = 0; i<5; i++){
173 // cout<<examine[i].getPAE_N()<<examine[i].getPAE_S()<<" ";
174 // }cout<<endl;
175
176 for ( int i = 0 ; i < 5 ; i ++ ) ... {
177
178 switch (examine[i].getPAE_S()) ... {
179 case ' C ' :
180 shape[0 ] ++ ;
181 break ;
182 case ' D ' :
183 shape[1 ] ++ ;
184 break ;
185 case ' H ' :
186 shape[2 ] ++ ;
187 break ;
188 case ' S ' :
189 shape[3 ] ++ ;
190 break ;
191
192 }
193
194 if (examine[i + 1 ].getPAE_N() - examine[i].getPAE_N() == 1 ) ... {
195 if ( ! already_apear) ... {
196 sequenceNum++ ;
197 biggerOne = examine[i + 1 ].getPAE_N();
198 already_apear= true ;
199 }
200 else ... {
201 if (examine[i + 1 ].getPAE_N() - biggerOne == 1 ) ... {
202 sequenceNum++ ;
203 biggerOne = examine[i + 1 ].getPAE_N();
204 }
205 }
206 }
207 }
208
209
210 for ( int i = 0 ; i < 4 ; i ++ ) ... {
211 if (sameShapeNum < shape[i]) ... {
212 sameShapeNum= shape[i];
213 }
214 }
215
216
217 if (sequenceNum == 5 && sameShapeNum == 5 ) ... {
218 if (who == 1 ) ... {
219 returnNum[0 ] = 9 ;
220 returnNum[1 ] = biggerOne;
221 }else ... {
222 returnNum_W[0 ] = 9 ;
223 returnNum_W[1 ] = biggerOne;
224 }
225 return 9 ; /**/ /// 스트레이트 플러시
226 }
227
228 for ( int i = 1 ; i < 15 ; i ++ ) ... {
229
230 if (numfre[i] == 4 ) ... { /**/ /// 포카드
231 if (who == 1 ) ... {
232 returnNum[0 ] = 8 ;
233 returnNum[1 ] = i;
234 }else ... {
235 returnNum_W[0 ] = 8 ;
236 returnNum_W[1 ] = i;
237 }
238 return 8 ;
239 }
240 else if (numfre[i] == 3 ) ... {
241 for ( int j = i + 1 ; j < 15 ; j ++ ) ... {
242 if (numfre[j] == 2 ) ... {
243 if (who == 1 ) ... {
244 returnNum[0 ] = 7 ;
245 returnNum[1 ] = i;
246 }else ... {
247 returnNum_W[0 ] = 7 ;
248 returnNum_W[1 ] = i;
249 }
250 return 7 ; // full house
251 }
252 }
253 if (who == 1 ) ... {
254 returnNum[0 ] = 4 ;
255 returnNum[1 ] = i;
256 }else ... {
257 returnNum_W[0 ] = 4 ;
258 returnNum_W[1 ] = i;
259
260 }
261 return 4 ; // three카드
262 }
263 else if (numfre[i] == 2 ) ... {
264 for ( int j = i + 1 ;j < 15 ; j ++ ) ... {
265 if (numfre[j] == 3 ) ... {
266 if (who == 1 ) ... {
267 returnNum[0 ] = 7 ;
268 returnNum[1 ] = j;
269 }
270 else ... {
271 returnNum_W[0 ] = 7 ;
272 returnNum_W[1 ] = j;
273 }
274 return 7 ; // full house
275 }
276 }
277 for ( int j = i + 1 ;j < 15 ; j ++ ) ... {
278 if (numfre[j] == 2 ) ... {
279 if (who == 1 ) ... {
280 returnNum[0 ] = 3 ; // two pair
281 returnNum[ 1 ] = max(i,j);
282 }else ... {
283 returnNum_W[0 ] = 3 ;
284 returnNum_W[1 ] = max(i,j);
285 }
286 return 3 ;
287 }
288 }
289 if (who == 1 ) ... {
290 returnNum[0 ] = 2 ;
291 returnNum[1 ] = i;
292 }else ... {
293 returnNum_W[0 ] = 2 ;
294 returnNum_W[1 ] = i;
295 }
296 return 2 ; // one pair
297 }
298 }
299
300
301 if (sequenceNum == 5 ) ... {
302 if (who == 1 ) ... {
303 returnNum[0 ] = 5 ;
304 returnNum[1 ] = biggerOne;
305 }else ... {
306 returnNum_W[0 ] = 5 ;
307 returnNum_W[1 ] = biggerOne;
308 }
309 return 5 ; // 스트레이트
310 }
311
312 int max = 0 ;
313
314 for ( int i = 0 ; i < 5 ; i ++ ) ... {
315 if (max < examine[i].getPAE_N())
316 max= examine[i].getPAE_N();
317 }
318
319 if (sameShapeNum == 5 ) ... {
320 if (who == 1 ) ... {
321 returnNum[0 ] = 6 ;
322 returnNum[1 ] = max;
323 }else ... {
324 returnNum_W[0 ] = 6 ;
325 returnNum_W[1 ] = max;
326 }
327 return 6 ; // 플러시
328 }
329 if (who == 1 ) ... {
330 returnNum[0 ] = 1 ;returnNum[ 1 ] = max;
331 }
332 else ... {
333 returnNum_W[0 ] = 1 ;returnNum_W[ 1 ] = max;
334 }
335
336 return 1 ;
337
338 }
339
340
접기