문제
구름이는 비밀스러운 이야기를 전달하기 위해서 새로운 암호 체계인 제곱암호를 고안했다. 제곱암호로 암호화된 문장은 다음과 같은 특징을 가진다.
●암호문의 길이가 N이라면, N/2개의 숫자와 N/2개의 알파벳 소문자로 이루어져 있다. 암호문의 길이는 항상 짝수이다.
●암호문의 첫 글자는 항상 알파벳 소문자이며, 이후에는 항상 숫자와 알파벳 소문자가 번갈아 가며 등장한다.
제곱암호로 암호화된 문장은 아래 방식을 통해 복호화할 수 있다.
●원문은 N/2의 길이를 가지고 있으며, 모두 알파벳 소문자이다.
●암호문의 첫 번째 문자부터 순서대로 아래의 복호화 과정을 거친다. 첫 번째 문자는 문장의 가장 왼쪽 문자를 의미한다.
●i가 홀수일 때, 암호문의 i번째 문자를 알파벳의 사전 기준 다음 문자로 바꾸는 작업을 암호의 i+1번째 수의 제곱 번 시행한다. 작업이 끝난 뒤 변환된 알파벳을 원문의 맨 오른쪽에 추가한다.
●z에서 사전 기준 다음 문자로 바꿔야 하는 경우에는 a로 바뀌게 된다.
구름이가 친구에게 제곱암호로 암호화된 문장을 받았을 때, 이를 원문으로 복호화하는 프로그램을 작성하시오.
입력
첫째 줄에 암호문의 길이 N(4 <= N <= 200,000)이 주어진다. N은 항상 짝수이다.
둘째 줄에 암호문 S가 주어진다. 암호는 알파벳 소문자와 숫자로 이루어져 있다. 주어지는 암호문은 제곱암호로 암호화된 문장의 특징을 만족한다.
문제에 조건에서 입력 받는 암호문의 첫글자는 항상 알파벳 소문자로 시작하며 이후 숫자와 알파벳이 순서대로 반복된다고 주어졌다.
따라서, 입력받은 암호문의 0번째부터 n-2까지 인덱스i를 2씩 증가시켜 가며 문제의 조건대로 i번째 문자를 i+1번째 수의 제곱만큼 쉬프트 시켜주어 각 암호문의 문자를 복호화 시켜주었다.
이때, 마지막 문자인 z는 쉬프트 시 알파벳 첫 문자인 a부터 시작해야 하므로 쉬프트 된 인덱스는 항상 26으로 모듈러 연산을 해주었다.
#include <iostream>
#include <string>
using namespace std;
int n;
char alphabet[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y','z' };
string secret, origin;
void decryption() {
for (int i = 0; i < n - 1; i += 2) {
int idx = secret[i] - 'a';
idx += (secret[i + 1] - '0') * (secret[i + 1] - '0');
idx %= 26;
origin += alphabet[idx];
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> secret;
decryption();
cout << origin;
return 0;
}
'Alrogithm > 구름(GOORM)' 카테고리의 다른 글
[구름 알고리즘 먼데이 챌린지] Week6 : 4. 경쟁 배타의 원리 (0) | 2022.11.14 |
---|---|
[구름 알고리즘 먼데이 챌린지] Week6 : 3. 비밀 편지 (0) | 2022.11.14 |
[구름 알고리즘 먼데이 챌린지] Week6 : 1. 7게임 (0) | 2022.11.14 |
[구름 알고리즘 먼데이 챌린지] Week5 : 3. 수 이어 붙이기 (0) | 2022.11.12 |
[구름 알고리즘 먼데이 챌린지] Week5 : 2. 모래섬 (0) | 2022.11.12 |