관리 메뉴

cococo-coding

[C++ 풀이] 11575번. Affine Cipher 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 11575번. Affine Cipher

_dani 2024. 1. 16. 17:27

문제

풀이

테스트케이스 개수t를 입력받고 while문으로 반복한다. 케이스별로 E(X)=(aX+b)mod 26에 들어갈 a, b값과 평문s를 입력받는다.

이때 우리가 사용할 코드체계는 문제에 나와있는 A=0, B=1, ..., Z=25이고

출력되는 형태는 아스키코드이다. 

 

for문을 이용하여 string을 입력받았을 때, 이 문자열은 아스키코드이므로 우리가 원하는 코드체계로 변경해주어야 한다. 

s[i]-65로 이를 구현한다.

ex) 예제에서 "IAMSPY"라는 문자열을 입력했을 때, 'I'라는 문자는 아스키코드로 73이다. 우리가 문제에서 쓰는 체계로 변경하려면 'I'=8이 되어야하므로 원래 코드에서 65를 빼준다. 

 

그리고 원래의 E(X)식대로 E(X)=(aX+b)mod 26를 구현해준다. (X=s[i]-65)

이제 출력만 하면 되는데, 아스키코드에 맞춰서 다시 65를 더해주어야 우리가 원하는 알파벳값이 나온다. (A=65, B=66, ..., Z=90)

 

아스키코드와 문제의 숫자체계를 왔다갔다해야해서 조금 헷갈릴 수 있는 문제이지만 이 부분만 잘 코딩하면 금방 풀린다.

 

포인트

출력되는 형태는 아스키코드이며, 우리는 문제에서 만든 A=0, B=1, ..., Z=25의 독자적인 기호체계를 쓰고 있으므로

아스키코드와 문제에서 사용하는 기호체계를 구분해야 함. 

 

코드

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

/*
    1. 테스트케이스 개수 t를 입력받는다.
    2. 케이스 별 a와 b, 평문s를 입력받는다.
    3. 아핀 암호를 이용해 평문을 바꾼다.
    4. 바꾼 결과를 출력한다.
*/

int main() {
    //1
    int t;
    cin >> t;
    //2
    while (t--) {
        int a, b;
        string s;
        
        cin >> a >> b >> s;

        //3
        for (int i = 0; i < s.size(); i++) {
            //원래그대로의 문자열 숫자버전이 나와야함
            s[i] = ((a * (s[i] - 65) + b) % 26) + 65;
            cout << s[i]; //4
        }
        cout << endl;    
    }

    return 0;
}

 

ps. 나는 처음에 아스키코드로 변경하지 않고, 문제에 있는 코드체계대로 식만 써서 풀었다가 문자열이 공백으로 출력되는 문제가 있었다. 아스키코드로 변환된 상태가 알파벳라인이 아니기 때문이었다.