아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

Studschiffret

시간 제한1초메모리 제한1024 MB

요약
대각선으로 이동하며 벽에 부딪히면 반사되고 이미 채워진 칸은 건너뛰는 빔을 N×M 격자에서 시뮬레이션해, 행 단위 암호문에서 원래 평문을 복원한다.
난이도

보통10점 중 6점

유형
시뮬레이션, 구현, 행렬, 배열
정답자
아직 제출이 없습니다

문제

Fretchif는 아무도 풀 수 없는 혁신적인 암호를 만들어 냈다! 방식은 다음과 같다. 암호화할 문자열 하나와 두 정수 NN, MM을 고른다. 그다음 NN개의 행과 MM개의 열로 이루어진 격자를 그린다. 이제 암호화할 문자열을 한 글자씩 왼쪽 위 모서리에서 오른쪽 아래 대각선 방향으로 써 나간다. 열을 왼쪽에서 오른쪽으로 11부터 MM까지, 행을 위에서 아래로 11부터 NN까지 번호를 매기면 첫 번째 글자는 (1,1)(1,1), 두 번째 글자는 (2,2)(2,2), 세 번째 글자는 (3,3)(3,3)과 같은 위치에 놓인다. 격자의 벽에 닿으면 "글자 광선"이 벽에서 반사된다(힌트의 예시를 참고). 이미 글자가 적혀 있는 칸에 도달하면, 쓰려던 글자를 그다음으로 도달하는 빈칸에 대신 쓴다. 암호화할 문자열의 모든 글자를 다 썼으면 격자를 행 단위로 읽어 암호문을 얻는다.

Fretchif가 studschiffret로 암호화한 메시지와 사용한 격자의 크기가 주어질 때, 원래 메시지를 출력하시오.

어떤 메시지는 특정 격자 크기로는 암호화할 수 없다. 새 빈칸에 도달하지 못한 채 아직 배치할 글자가 남아 있을 수 있기 때문이다. 하지만 여기서는 Fretchif가 문자열을 암호화할 때 그런 일이 일어나지 않았다고 보장된다.

입력

첫째 줄에 격자의 행과 열의 수를 나타내는 두 정수 2≤N≤202 \leq N \leq 20, 2≤M≤202 \leq M \leq 20이 주어진다. 둘째 줄에 KK개의 글자로 이루어진 문자열이 주어진다(1≤K≤301 \leq K \leq 30). 이는 암호화된 메시지이다. 메시지는 알파벳 대문자 A부터 Z까지만으로 이루어져 있다. 이 암호문을 만들어 내는 원본 문자열이 존재한다고 보장된다.

출력

프로그램은 암호화되기 전의 원래 메시지 문자열을 한 줄에 출력한다.

힌트

암호화할 문자열이 ABCDEFGHIKLMNOPQRST이고 격자의 크기가 6×136 \times 13이라고 하자. 암호화 과정의 여러 시점에서 격자는 다음과 같다.

6글자를 쓴 뒤8글자를 쓴 뒤, 아래쪽 벽에서 한 번 반사되었다
14글자를 쓴 뒤, 위쪽과 오른쪽 벽에서도 반사되었다20글자를 모두 쓴 뒤, H 위에 R을 덮어쓰지 않고 R을 다음 빈칸에 썼다는 점에 주목하라

이 예시에서 암호문은 ATKBSJLCRIMDHNEGQOFP가 된다. 예제 2는 ATKBSJLCRIMDHNEGQOFP를 복호화하는 것이고, 복호화하면 ABCDEFGHIJKLMNOPQRST가 된다.

예제4

  1. 예제 1

    입력
    2 20
    PORMEIGRGAMRN
    
    예상 출력
    PROGRAMMERING
    
  2. 예제 2

    입력
    6 13
    ATKBSJLCRIMDHNEGQOFP
    
    예상 출력
    ABCDEFGHIJKLMNOPQRST
    
  3. 예제 3

    입력
    5 7
    SLUIMPEGEHTR
    
    예상 출력
    SUPERHEMLIGT
    
  4. 예제 4

    입력
    15 19
    DALIGREKTANGEL
    
    예상 출력
    DALIGREKTANGEL