본문 바로가기
Computer Science

암호코드 스캔

by OKOK 2019. 1. 24.

1. 뒤에서 부터 계산

2. ratio 를 찾는 아이디어

3. 비트 연산

4. bin 이라는 배열을 완성 시키는 것

5. 함수를 분리해서 역할을 명확히 할 것 


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
#include <stdio.h>
 
char code[2000][501];
int password[8];
int bin[2000];
 
int decode(int);
 
int main()
{
    freopen("input.txt""r", stdin);
    int T, test_case;
    int N, M;
    int odd, even;
    int res;
    int tmp;
    int ratio[3];
    int length;
    int end;
    int i, j, k, l;
 
    scanf("%d"&test_case);
    for (T = 1; T <= test_case; ++T)
    {
        res = 0;
        scanf("%d %d"&N, &M);
        for (i = 0; i < N; ++i)
            scanf("%s"*(code + i));
        for (i = 0; i < N; ++i)
        {
            for (j = M - 1; j >= 0--j)
            {
                if (code[i][j] != '0')
                {
                    ratio[0= ratio[1= ratio[2= 0;
                    length = 100;
                    for (k = 0; k < 8++k)
                        password[k] = 0;
                    odd = even = 0;
                    for (k = j; k >= 0--k)
                    {
                        if (code[i][k] >= 'A')
                            tmp = code[i][k] - 'A' + 10;
                        else if (code[i][k] >= '0')
                            tmp = code[i][k] - '0';
                        for (l = 0; l < 4++l)
                        {
                            bin[4 * (j - k) + l] = tmp % 2;
                            tmp /= 2;
                        }
                    }
                    k = 0;
                    while (bin[k] == 0)
                        ++k;
                    for (l = 0; l < 3++l) // 최소 연속된 숫자를 찾는 것임
                    {
                        while (bin[k] == (l + 1) % 2)
                        {
                            ++k;
                            ratio[l]++;
                        }
                        if (length > ratio[l])
                            length = ratio[l];
                    }
                    tmp = j - length * 14;
                    end = (tmp > 0 ? tmp : 0);
 
 
                    tmp = 0;
                    while (bin[tmp] == 0)
                        ++tmp;
 
                    for (k = 7; k >= 0--k)
                    {
                        for (l = 0; l <= 6++l, tmp += length)
                            password[k] += (bin[tmp] << l);
                        password[k] = decode(password[k]);
                        if ((k + 1) % 2)
                            odd += password[k];
                        else
                            even += password[k];
                    }
                    if ((3 * odd + even) % 10 == 0)
                        res += (odd + even);
 
                    for (k = i; code[k][(end + j) / 2!= '0'++k) // 16진수가 붙어 있으므로, 가운데에 0이 들어갈 수 없음
                    {
                        for (l = end; l <= j; ++l)
                            code[k][l] = '0';
                    }
                }
            }
        }
        printf("#%d %d\n", T, res);
    }
 
    return 0;
}
 
int decode(int src)
{
    switch (src)
    {
    case 13return 0;
    case 25return 1;
    case 19return 2;
    case 61return 3;
    case 35return 4;
    case 49return 5;
    case 47return 6;
    case 59return 7;
    case 55return 8;
    case 11return 9;
    defaultreturn -1;
    }
}
 
cs

 


'Computer Science' 카테고리의 다른 글

균형점  (0) 2019.01.24
최대 상금  (0) 2019.01.24
단순 2진 암호코드  (0) 2019.01.24
Contact  (0) 2019.01.24
비밀번호  (0) 2019.01.24

댓글