Algorithm/SWEA

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

benguin 2019. 7. 1. 12:03

[URL]

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

 

 

[풀이 과정]

*시뮬레이션

 

1. 초기화 + 입력받기 : clear(), input()함수

 

2. 2차원 배열 arr[][]에서 56자리수 찾아내기

 

3. 56자리수 1차원 배열 code[]에 담기

 

4. 7자리씩 끊어 check[][]배열과 비교하여 같으면 dap[]배열에 그 수 저장. : isSame()함수

 

5, 최종적으로 dap[]배열 검사 : calDap()함수

 

 

 

[소스 코드]

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <string.h>
using namespace std;
 
int N, M;
int arr[55][105];
int code[56];
int dap[8];
int check[10][7= {
    {0001101},    //0
    {0011001},    //1
    {0010011},    //2
    {0111101},    //3
    {0100011},    //4
    {0110001},    //5
    {0101111},    //6
    {0111011},    //7
    {0110111},    //8
    {0001011}    //9
};
 
int X;
int start;
int end;
int sum;
 
void clear() {
    //arr[][] 초기화
    for (int i = 0; i < 55; i++)
    {
        memset(arr[i], 0sizeof(int* 105);
    }
 
    //code[] 초기화
    memset(code, -1sizeof(int* 56);
 
    //code[] 초기화
    memset(dap, 0sizeof(int* 8);
 
    // 초기화
    X = -1;
    start = -1;
    end = -1;
    sum = 0;
}
 
void input(){
    scanf("%d %d"&N, &M);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%1d"&arr[i][j]);
        }
    }
 
    // 스캐너로 부터 56자리수 추출
    for (int i = 0; i < N; i++)
    {
        for (int j = M - 1; j >= 0; j--)
        {
            if (arr[i][j] == 1)
            {
                X = i;
                end = j;
                start = end - 55;
                break;
            }
        }
        if (end != -1 && start != -1)
        {
            break;
        }
    }
}
 
bool isSame(int index, int val) {
    int flag = 1;
 
    for (int i = index; i < index + 7; i++)
    {
        if (code[i] != check[val][i % 7])
            flag = 0;
    }
 
    return flag;
}
 
void calcDap()
{
    int temp1 = dap[0+ dap[2+ dap[4+ dap[6];
    int temp2 = dap[1+ dap[3+ dap[5];
 
    if ((temp1 * 3 + temp2 + dap[7]) % 10 == 0)
        sum = temp1 + temp2 + dap[7];
}
 
int main() {
    int T;
    scanf("%d"&T);
 
    for (int tc = 0; tc < T; tc++)
    {
        // 초기화
        clear();
        
        // 입력
        input();
 
        // code[]에 추출한 56자리 수 넣기
        for (int i = 0; i < 56; i++)
        {
            code[i] = arr[X][start + i];
        }
 
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                //code[]랑 check[j][]배열 비교
                if (isSame(i*7, j))
                {
                    dap[i] = j;
                    break;
                }
            }
        }
 
        // 올바른 코드인가? 판별 ( 홀수자리 , 짝수 자리, 마지막 자리 검증 )
        calcDap();
        printf("#%d %d\n", tc + 1, sum);
    }
 
    return 0;
}
cs