안녕 세상아,

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

SWEA

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

돈 많은 백수가 되고싶다 2024. 11. 8. 23:59

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do?contestProbId=AV15FZuqAL4CFAYD&isPostMethod=Y&do_url=%2Fmain%2FsolvingProblem%2FsolvingProblem.do&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE&&&&&

 

SW Expert Academy

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

swexpertacademy.com

문제를 풀기 위해서는 문제를 이해해야된다. 이해가 잘 안돼서 한참 읽었던 것 같다. 

 

간단하게 설명하면 암호화된 암호문을 숫자로 바꿔서 10의 배수가 맞는지 검증하면 된다. 

문제에서 0부터 9까지 수가 암호화된 암호문은 제공해주었다. 나는 비율보다 그냥 7자리 숫자를 그대로 사용하였다. 주의깊게 볼 것은 모든 암호가 1로 끝난다. 이것으로 주어진 입력문을 구분하면 된다. 

 

 주어진 입력문은 0과 1로 이루어져있는데 이 중 암호문을 찾기 위해서는 각 행 별로 맨 뒤에서부터 보면서 1을 찾으면 된다. 찾은 1로부터 앞으로 55개를 가면 암호문의 시작이다.   

 

위를 바탕으로 단계를 나눠가면서 풀었다. 

 

1. 우선 주어진 암호문을 배열 형식으로 저장한다. 

2. 입력문을 vector에 넣는다. 

3. 암호문의 범위를 찾기 위해 맨 뒤 행에서 부터 1을 찾는다. 

4. 만약 찾게 되면 해당 행과 열을 각각 x, y에 저장해놓는다. 

5. 암호문은 무조건 56자리이기 때문에 아까 찾은 행과 열로 해당 부위를 추출한다. (substr)

6. 56자리로 추출한 암호문에서 실질적인 숫자를 찾아야하기 때문에 다시 7씩 나눠서 숫자를 추출한다. 추출하는 방법은 7자리와 arr[i]를 비교하면 된다. 

7. 만약 arr[i]와 같은 암호가 있다면 해당 암호는 숫자로 복호화 해준 후 새로운 vector decoded에 넣어준다.

8. 모두 완료가 되면 decoded 벡터에서 홀수와 짝수를 분리해준 후 문제 조건에 맞춰 10의 배수인지 판별한다.  

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string arr[10] = { "0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011" };
    int T;
    cin >> T;

    for (int test_case = 1; test_case <= T; ++test_case) {
        int N, M;
        cin >> N >> M;

        vector<string> sample(N);
        for (int i = 0; i < N; ++i) {
            cin >> sample[i];
        }

        // 1. 암호코드가 포함된 마지막 줄 찾기
        int x = -1, y = -1;
        for (int i = N - 1; i >= 0; --i) {
            for (int j = M - 1; j >= 0; --j) {
                if (sample[i][j] == '1') {
                    x = i;
                    y = j;
                    break;
                }
            }
            if (x != -1) break;
        }

        // 2. 56비트 길이의 암호코드 추출
        string code = sample[x].substr(y - 55, 56);

        // 3. 7비트씩 끊어 디코딩
        vector<int> decoded;
        for (int i = 0; i < 56; i += 7) {
            string segment = code.substr(i, 7);
            bool matched = false;
            for (int k = 0; k < 10; ++k) {
                if (segment == arr[k]) {
                    decoded.push_back(k);
                    matched = true;
                    break;
                }
            }
            if (!matched) {
                cout << "#" << test_case << " 0" << endl;
            }
        }

        // 4. 검증 코드 확인
        int sum_odd = 0, sum_even = 0;
        for (int i = 0; i < 8; ++i) {
            if (i % 2 == 0) {
                sum_odd += decoded[i];
            } else {
                sum_even += decoded[i];
            }
        }
        int totalSum = sum_odd * 3 + sum_even;

        if (totalSum % 10 == 0) {
            int finalSum = sum_odd + sum_even;
            cout << "#" << test_case << " " << finalSum << endl;
        } else {
            cout << "#" << test_case << " 0" << endl;
        }

    }

    return 0;
}

 

벡터 말고 배열로 계속 풀고 뭔가 로직도 맞는 것 같은데 자꾸 틀려서...거의 하루 종일 푼 것 같다. 지피티한테 물어봐도 배열로 푼거 문제 없다고 했는데 왜 안되는지 아직도 모르겟다.. 뭔가 배열로 풀어도 맞는 것 같아서  계속 붙잡고있다가 안돼서 바꾼 이 방법...허탈하지만...모르겠다...ㅠ그냥 소질이 없을지도..? 하아...