비밀 메시지를 작성하는 고전적인 방법인 정사각형 암호를 구현해 보세요.
영어 텍스트가 주어지면, 그 텍스트의 인코딩된 버전을 출력해요.
먼저 입력은 정규화돼요: 영어 텍스트에서 공백과 구두점을 제거하고 메시지를 소문자로 바꿔요.
그런 다음, 정규화된 문자들을 행으로 나눠요. 이 행들은 사이에 줄바꿈을 넣어 출력하면 직사각형을 이룬다고 볼 수 있어요.
예를 들어, 다음 문장은
"If man was meant to stay on the ground, god would have given us roots."
다음과 같이 정규화돼요:
"ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots"
평문은 가능한 한 정사각형에 가까운 직사각형으로 구성해야 해요. 직사각형의 크기는 메시지의 길이에 따라 정해져요.
c가 열의 수이고 r이 행의 수라면, r x c 직사각형에 대해 다음을 만족하는 가장 작은 정수 c를 찾아요:
r * c >= length of message,c >= r,c - r <= 1.정규화된 텍스트는 54자이고, 이에 따라 c = 8, r = 7인 직사각형이 정해져요:
"ifmanwas"
"meanttos"
"tayonthe"
"groundgo"
"dwouldha"
"vegivenu"
"sroots "
암호화된 메시지는 열을 왼쪽에서 오른쪽으로 읽어 내려가면서 얻어요.
위 메시지는 다음과 같이 암호화돼요:
"imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau"
인코딩된 텍스트를 (r X c) 크기의 완벽한 직사각형을 채우는 묶음으로 출력해요. 이때 r 길이의 묶음이 c개이고, 공백으로 구분해요.
완벽한 직사각형에 n 글자 부족한 문구라면, 마지막 n개 묶음 각각 뒤에 공백 하나를 덧붙여요.
"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau "
이 묶음들을 쌓으면 암호문을 시각적으로 원래 메시지로 되돌릴 수 있다는 점을 눈여겨봐요:
"imtgdvs"
"fearwer"
"mayoogo"
"anouuio"
"ntnnlvt"
"wttddes"
"aohghn "
"sseoau "