상세 컨텐츠

본문 제목

9778. 카드 게임

알고리즘/SWExpertAcademy

by 아리따운노을 2020. 4. 9. 16:24

본문

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

카드 게임을 좋아하는 승현이는 요즘 블랙잭에 빠져 있다. 잘생긴 승현이와 함께 블랙잭의 규칙을 알아보자!

 

 

블랙잭을 처음 시작할 때, 덱에는 2, 3, 4, 5, 6, 7, 8, 9의 가치를 가지는 카드가 각각 4장,
11의 가치를 가지는 카드(Ace) 4장, 10의 가치를 가지는 카드 16장 (Ten, Jack, Queen, King), 총 52장의 카드가 올려져 있다.

 

맨 처음에 모든 카드는 가치를 알 수 없게 뒤집어져 있다.
승현이는 선택한 카드들의 가치의 합이 21을 넘지 않으면서도 가능한 가치의 합이 커지도록 카드를 뽑고 싶다.


지금 승현이는 이미 N장의 카드를 뽑아서 덱에는 52-N장의 카드가 남아 있으며, 승현이는 여기서 카드를 한 장 더 뽑을 지 말지 고민하고 있다.

승현이는 덱에 남아있는 카드 중 하나를 뽑았을 때,

"뽑은 모든 카드의 가치의 합이 21보다 크게 만드는 카드의 개수"가 "뽑았을 때 가치의 합을 21 이하로 만드는 카드의 개수"보다 크거나 같다면 게임을 그만 둘 것이다.

승현이가 뽑은 모든 카드의 가치가 주어질 때, 승현이가 게임을 그만 둬야 하는지 판단해주자!

 

[입력]

첫 번째 줄에 테스트 케이스의 수 TC가 주어진다.
이후 TC개의 테스트 케이스는 각각 다음과 같은 구성과 조건을 따른다.

        - 첫 번째 줄에는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 52)

        - 이후 N개의 줄에 승현이가 뽑아 놓은 카드의 가치가 주어진다.        

        - 문제에 주어진 조건에서 벗어나는 경우의 입력은 존재하지 않는다.
             (각 카드의 가치는 모두 2이상 11이하의 정수이며, 2가 5번 이상 등장하지 않는 등)

 

[출력]

각 테스트 케이스마다 ‘#t’( t 는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
승현이가 게임을 그만 둬야 한다면 “STOP”을, 계속 해도 된다면 “GAZUA”를 출력한다.

 

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
#include <iostream>
 
using namespace std;
 
int MAP[12];
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int tc, n, sum, blackjack,before, after;
    cin>>tc;
    for(int t=1;t<=tc;t++)
    {
        cin>>n;
        sum = 0, before = 0, after = 0;
        for(int i=2;i<=11;i++)
            MAP[i] = 4;
        MAP[10= 16;
        
        int temp;    
        for(int i=0;i<n;i++)
        {
            cin>>temp;
            MAP[temp]--;
            sum += temp;
        }
        blackjack = 21 - sum;
        for(int i = 2;i<=blackjack;i++)
            before += MAP[i];
        for(int i=blackjack + 1;i<=11;i++)
            after += MAP[i];
        if(after>before)
            cout<<'#'<<t<<" STOP\n";
        else
            cout<<'#'<<t<<" GAZUA\n";
    }
 
    return 0;
}
 
cs

21.... 익숙한 숫자... 블랙잭 확률 구하기 문제다.

1. ace를 11, 10, J, Q, K를 10으로 본다 했으니까 남은 가짓수 행렬 초기화를 10만 16으로 나머지는 4로 해준다.

2. 행렬을 입력 받으면서 해당 카드를 한장씩 빼준다. 블랙잭은 합을 보는 도박이므로 현재 숫자도 더해준다.

3. 이제 blackjack의 타겟인 21에서 현재 숫자의 합을 빼준다.

4. 현재 합에서 21을 넘어가지 않기 위한 카드의 개수와 넘어가는 카드의 개수를 구한다. 블랙잭은 21이 이기는 숫자이므로 before에 속한다.

5. 넘어가는 카드가 많으면 stop 그렇지 않으면 가즈아ㅏㅏㅏㅏ

 

관련글 더보기

댓글 영역