셰이크, 래틀, 롤 암호화
시간 제한1초메모리 제한128 MB
메시지를 대문자로 정사각 행렬에 채우고 남는 칸은 A부터 차례로 채운 뒤, 키에 나온 순서대로 shake, rattle, roll을 적용해 최종 문자열을 출력한다.
문제
Sam은 Sally에게 비밀 메시지를 보내고 싶어 하고, 반대로 Sally도 마찬가지입니다. 두 사람은 손으로 직접 수행할 수 있는 간단하지만 효과적인 암호화 방식을 고안했습니다. 그런데 주고받는 메시지가 점점 길어지자, 이 과정을 자동화하기로 합니다. 여러분의 과제는 이들의 "셰이크, 래틀, 롤(shake, rattle and roll)" 암호화 방식을 구현하는 것입니다. (복호화는 구현하지 않습니다.)
텍스트 메시지를 정사각형 2차원 배열에 행 우선(row-major) 순서로, 한 칸에 한 글자씩 채웁니다. 모든 문자는 대문자로 저장합니다. 메시지가 배열을 완전히 채우지 못하면, 남은 칸은 알파벳 대문자 A부터 Z까지를 순서대로(필요하면 반복하여) 채웁니다. 행렬은 항상 정사각형이며 크기는 3×3부터 100×100까지입니다. 예를 들어, 메시지 "Meet me at the pizza parlor"를 6×6 배열에 넣으면 아래 그림과 같습니다(모든 문자가 대문자로 저장된다는 점에 유의하세요).

메시지를 암호화할 때는 세 가지 연산을 수행합니다. 각 연산은 키에 등장한 횟수만큼, 주어진 순서대로 적용됩니다.
셰이크(Shake) — 열은 1번부터 번호를 매깁니다. 홀수 번째 열은 한 글자씩 위로 이동하며, 맨 위 글자는 그 열의 맨 아래로 돌아옵니다. 짝수 번째 열은 한 글자씩 아래로 이동하며, 맨 아래 글자는 그 열의 맨 위로 돌아옵니다. 예를 들면:

래틀(Rattle) — 행은 위에서부터 1번으로 번호를 매깁니다. 홀수 번째 행은 한 글자씩 오른쪽으로 이동하며, 맨 오른쪽 글자는 그 행의 맨 왼쪽으로 돌아옵니다. 짝수 번째 행은 한 글자씩 왼쪽으로 이동하며, 맨 왼쪽 글자는 그 행의 맨 오른쪽으로 돌아옵니다. 예를 들면:

롤(Roll) — 행렬을 이루는 동심(테두리) "고리(loop)"들을 생각합니다. 각 고리는 그 고리의 가장 윗줄이 몇 번째 행인지로 번호를 매깁니다(가장 바깥 고리의 윗줄은 1번 행). 홀수 번째 고리는 한 글자씩 시계 방향(오른쪽)으로 회전하고, 짝수 번째 고리는 한 글자씩 반시계 방향(왼쪽)으로 회전합니다. 예를 들면:

입력
입력은 하나 이상의 암호화 문제로 이루어집니다. 각 문제는 두 줄을 차지합니다. 첫 번째 줄은 암호화 키이고, 두 번째 줄은 암호화할 텍스트입니다.
암호화 키는 두 자리 행렬 크기로 시작하고, 그 뒤에 S, R, L 문자가 임의의 순서로 이어집니다. S는 셰이크를, R는 래틀을, L은 롤을 각각 한 번 수행하며, 등장한 순서대로 적용됩니다. 크기 00은 100을 의미합니다.
키의 길이는 최대 80자입니다. 각 메시지는 최대 10,000자이며, 항상 지정된 행렬 안에 들어간다고 가정합니다.
출력
각 문제마다 암호화된 텍스트를 한 줄에 하나씩 출력합니다. 암호화된 텍스트의 길이는 행렬 크기의 제곱과 같습니다(예: 3×3 행렬은 길이 9인 문자열을 만듭니다).