[C++][백준 26266] 비즈네르 암호 해독

PublicMinsu·2024년 6월 23일
0

문제

접근 방법

알파벳 또한 숫자로 계산이 가능하다.
암호문이 평문과 키를 더해서 만들어졌다면 역으로 키는 암호문을 평문으로 뺀 값으로 구할 수 있는 것이다.

코드

#include <iostream>
using namespace std;
string plain, password, answer;
int main()
{
    ios::sync_with_stdio(0), cin.tie(0);

    cin >> plain >> password;

    int size = plain.size();

    answer.reserve(size);

    for (int i = 0; i < size; ++i)
    {
        int ch = ((password[i] - plain[i] + 26) % 26);

        if (ch == 0)
        {
            answer.push_back('Z');
        }
        else
        {
            answer.push_back(ch + 64);
        }
    }

    for (int i = 1; i <= size / 2; ++i)
    {
        if (size % i)
        {
            continue;
        }

        string repeatStr = answer.substr(0, i);
        string temp = "";

        while (temp.size() != size)
        {
            temp += repeatStr;
        }

        if (temp == answer)
        {
            cout << repeatStr;
            return 0;
        }
    }

    cout << answer;
    return 0;
}

풀이

0인 경우에는 Z라는 점
키로 적합한 값이 맞는지 확인해야 하는 점 (ABCABCD와 같은 키의 경우 첫 ABC와 두 번째 ABC만 확인하고 키를 ABC라고 생각하면 문제가 발생한다)

위 2가지를 조심하는 게 좋다.

profile
연락 : publicminsu@naver.com

0개의 댓글