programming/c

[Algorithm] Baby Gin

Baby Gin은 카드로 게임을 한다.

각 카드는 0 에서 9 까지의 수가 쓰여져 있다.

게이머는 6 장의 카드를 받는다.


받는 사람이 Baby Gin을 가진다면 이 게이머가 이기고 아니면 진다.

Baby Gin을 가지기 위해서는 모든 6장의 카드가

런(runs)이거나, 트리플리트(tripletes) 이여야 한다.


• 런이라는 말은 3장의 카드가 연속적인 번호를 말한다.

ex. 345 혹은 789 .., 단, 901 은 런이아니다.

• 트리플리트는 같은 번호를 가지는 세장의 카드를 말한다.

ex. 000 혹은 444, ...


몇 가지 예를 보면,

• 667767 은 Baby Gin이다. 두 개의 트리플리트(666, 777)

• 054060 은 Baby Gin이다. 하나의 런과 하나의 트리플리트

• 101123 은 Baby Gin이 아니다.


6 개의 숫자를 입력으로 받아

Baby Gin 인지 아닌지를 판별하는 프로그램을 작성하는것이 일이다.


<입력>

0 에서 9 사이의 6 개의 숫자가 입력으로 주어진다.


<출력>

Baby Gin 이면 gin, 아니면 lose를 출력한다.


<입출력 예>

입력 : 6 6 7 7 6 7

출력 : gin


입력 : 0 5 4 0 6 0

출력 : gin


입력 : 1 0 1 1 2 3

출력 lose


입력 : 2 2 1 1 0 0

출력 : gin




Program    Counting Sort를 이용한 Baby Gin구현



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
/*
    Thursday, January 4, 2018
    DAY 07 : Homework (Baby Gin)
*/
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
void InputNum(int *p);
void BabyGin(int data[], int *runsCount, int *triCount);
void Output(int *runsCount, int *triCount);
 
int main(void)
{
    int data[6];
    int runsCount = 0;
    int triCount = 0;
 
    InputNum(data);
    BabyGin(data, &runsCount, &triCount);
    Output(&runsCount, &triCount);
 
    return 0;
}
 
void InputNum(int *data)
{
    int i;
 
    printf("Input data : ");
    for (i = 0; i < 6; i++) {
        scanf("%d"&data[i]);
        if (data[i] < || data[i] > 9) {
            puts("You entered wrong data!");
            exit(-1);
        }
    }
}
 
void BabyGin(int data[], int *runsCount, int *triCount)
{
    int NumCntArr[10= { };
    int ActionCount = 0;
    int i;
 
    while (ActionCount != 6) {
        switch (*(data + ActionCount))
        {
        case 0: NumCntArr[0]++; ActionCount++continue;
        case 1: NumCntArr[1]++; ActionCount++continue;
        case 2: NumCntArr[2]++; ActionCount++continue;
        case 3: NumCntArr[3]++; ActionCount++continue;
        case 4: NumCntArr[4]++; ActionCount++continue;
        case 5: NumCntArr[5]++; ActionCount++continue;
        case 6: NumCntArr[6]++; ActionCount++continue;
        case 7: NumCntArr[7]++; ActionCount++continue;
        case 8: NumCntArr[8]++; ActionCount++continue;
        case 9: NumCntArr[9]++; ActionCount++continue;
        }
    }
 
    for (i = 0; i < 10; i++) {
        if (NumCntArr[i] == 3) {
            *runsCount += 1;
            NumCntArr[i] = 0;
        }
    }
 
    for (i = 1; i < 9; i++) {
        if (NumCntArr[i - 1== && NumCntArr[i] == && NumCntArr[i + 1== 2) {
            *triCount += 2;
            NumCntArr[i - 1= 0;
            NumCntArr[i] = 0;
            NumCntArr[i + 1= 0;
        } else if (NumCntArr[i - 1== && NumCntArr[i] == && NumCntArr[i + 1== 1) {
            *triCount += 1;
            NumCntArr[i - 1= 0;
            NumCntArr[i] = 0;
            NumCntArr[i + 1= 0;
        }
    }
}
 
void Output(int *runsCount, int *triCount)
{
    if (*runsCount + *triCount == 2)
        puts("Baby Gin!");
    else
        puts("Failed!");
}
cs