1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드

SW 업무 관련/SW Expert Academy

1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드

WillBe_ 2018. 7. 6. 00:57


입력 배열 다 필요 없이 맨 위에 한 줄만 있으면 암호를 해독하는데 충분하다.

map 배열에 암호가 저장되며 입력되는 배열에 1이 입력 된 후부터 최대 56개를 입력받는다.

map 배열에 6부터 대입한 이유는 1앞에 0이 올수도 있기 때문!!!


이렇게 찾은 map 배열의 뒤에서부터 비교해가면서 암호를 찾았다.

암호의 맨 뒤는 무조건 1이기 때문에!!!!! 시작 위치가 명확하다.


끝!



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
#include <stdio.h>
#include <string.h>
 
int map[120], password[10];
int code[10][7= {
    {0,0,0,1,1,0,1},//0
    {0,0,1,1,0,0,1},//1
    {0,0,1,0,0,1,1},//2
    {0,1,1,1,1,0,1},//3
    {0,1,0,0,0,1,1},//4
    {0,1,1,0,0,0,1},//5
    {0,1,0,1,1,1,1},//6
    {0,1,1,1,0,1,1},//7
    {0,1,1,0,1,1,1},//8
    {0,0,0,1,0,1,1}//9
};
int len, start;
int back = 0;
 
int check()
{
    int num = 7, point = 0, total = 0;
 
    point = back;
    for (int a = 7; a >= 0; a--)
    {
        for (int i = 0; i < 10; i++)
        {
            int count = 0;
            for (int j = 0; j < 7; j++)
            {
                if (code[i][6 - j] == map[point - j])
                {
                    count++;
                }
                if (count == 7)
                {
                    point -= 7;
                    password[num--= i;
                }
            }
        }
    }
 
    total = 3 * (password[0+ password[2+ password[4+ password[6]) + password[1+ password[3+ password[5+ password[7];
 
    if (total % 10 == 0)
    {
        total = 0;
        for (int i = 0; i < 8; i++)
        {
            total += password[i];
        }
        return total;
    }
    else
    {
        return 0;
    }
}
 
 
int main()
{
    int Test;
    scanf("%d"&Test);
    for (int i = 1; i <= Test; i++)
    {
        int a, b, k, Flag = 0;
        back = 0;
        memset(map, 0sizeof(map));
        memset(password, 0sizeof(password));
        len = 0; start = 0;
        scanf("%d %d"&a, &b);
 
        for (int y = 0; y < a*b; y++)
        {
                scanf("%1d"&k);
                if (Flag == 1 && len < 56)
                {
                    map[6 + len++= k;
                }
                else if (k == 1 && Flag == 0)
                {
                    map[5= k;
                    Flag = 1;
                }
        }
 
        for (int y = 119; y >= 0; y--)
        {
            if (map[y] == 1)
            {
                back = y;
                break;
            }
        }    
 
        printf("#%d %d\n", i, check());
    }
 
    return 0;
}
cs