델타 암호화와 복호화
시간 제한1초메모리 제한128 MB
이전 글자와의 값 차이로 치환하는 암호를 정의하고 그 암호로 텍스트를 암호화, 복호화하는 명령어 인터프리터를 정확한 출력 형식으로 구현하는 문제입니다.
문제
델타 암호(delta cipher)는 매우 단순하면서도 치환 암호보다 크게 개선된 암호화 방식입니다. 알파벳 26개 글자 A–Z에는 각각 0부터 25까지의 숫자 값이 하나씩 배정됩니다. 이 배정은 일대일 대응(글자들의 순열)이며, 반드시 알파벳 순서일 필요는 없습니다. 기본 암호표는 A = 0, B = 1, …, Z = 25로 값을 배정하며, 새로운 유효한 암호표가 주어지기 전까지 사용됩니다.
암호화는 연속한 글자들의 값 차이를 이용합니다.
- 글자가 아닌 문자는 모두 그대로 출력합니다.
- 어떤 글자 바로 앞이 글자가 아닐 때(문자열의 첫 글자 포함), 그 글자는 앞에
A가 있는 것으로 간주합니다. - 대소문자는 유지됩니다. 입력이 대문자면 출력도 대문자, 소문자면 소문자입니다. 다만
A와a는 같은 글자로 보아 값이 같습니다. - 어떤 글자가 다른 글자 뒤에 올 때, 현재 글자의 값에서 바로 앞 글자의 값을 뺍니다. 이 차이를 26으로 나눈 나머지에 해당하는 값을 가진 글자가 출력에서 현재 글자를 대신합니다(현재 글자의 대소문자는 유지).
복호화는 이 과정을 거꾸로 수행하여 한 글자씩 원래 문자열을 복원합니다.
입력
입력은 한 줄에 하나씩 주어지는 명령들의 나열이며, 파일 끝(EOF)에서 종료됩니다. 어떤 줄도 10000자를 넘지 않습니다. 명령은 세 가지이고, 명령어의 대소문자는 구분하지 않습니다. 각 명령어 뒤에는 적어도 하나의 공백이 옵니다.
ENCRYPT— 줄의 나머지는 현재 암호표로 암호화할 평문입니다.DECRYPT— 줄의 나머지는 현재 암호표로 평문으로 되돌릴 암호문입니다.CIPHER— 줄의 나머지는 새 암호표를 정의합니다. 정확히 26개의 글자가 중복 없이 있어야 하며, 공백과 문장 부호는 무시합니다. 글자들의 순서가 값을 정합니다. 첫 번째 글자의 값은 0, 두 번째는 1, 이런 식으로 이어집니다.
첫 단어가 이 세 명령 중 어느 것도 아닌 줄은 이해할 수 없는 명령입니다.
출력
입력의 각 줄마다 한 줄씩 출력합니다. 아래에 보이는 공백은 출력의 일부이며 정확히 그대로 재현해야 합니다. 특히 모든 출력 줄은 공백 한 칸으로 끝납니다.
ENCRYPT와DECRYPT:RESULT:다음에 공백 두 칸, 변환된 문자열, 그리고 공백 한 칸을 출력합니다.- 유효한
CIPHER:Good cipher.다음에 공백 두 칸,Using, 공백 한 칸, 26개의 글자를 대문자로 쓴 것, 그리고 마침표와 공백 한 칸을 출력합니다. 이후 모든 명령은 이 새 암호표를 사용합니다. - 잘못된
CIPHER(글자 개수가 틀리거나 글자가 중복된 경우):Bad cipher.다음에 공백 두 칸,Using default., 그리고 공백 한 칸을 출력하고, 이후에는 기본 암호표를 사용합니다. - 인식할 수 없는 명령:
Command not understood.다음에 공백 한 칸을 출력합니다.