암호 깨기
면접 대비시간 제한2초메모리 제한128 MB
치환 암호로 암호화된 후보 문장들 중 평문과 일치하는 경우를 모두 찾아 메시지 X를 복호화하고 모호한 위치에 ?를 출력합니다.
문제
테러 조직 NWERC(New World Ensemble for Rebellious Coders)가 우리 사회를 위협하고 있다. 다행히 우리는 들키지 않고 그들의 통신을 가로채는 방법을 알아냈다. 문제는 그 통신이 전부 암호화되어 있다는 점이다.
정보원이 알아낸 사실은 두 가지다. 그들의 메시지는 알파벳 소문자로만 이루어져 있고, 암호화 방식은 BAPC(Basic Alphabet Permutation Code), 즉 일대일 치환이다. 같은 알파벳은 언제나 같은 문자 하나로 바뀌며, 그 문자는 원래 알파벳과 같아도 된다. 암호화 전에 서로 달랐던 두 문자는 암호화 후에도 반드시 서로 다른 문자로 나타난다. 예를 들어 "hello"는 "ifmmp"나 "holle"로 암호화될 수 있지만, "cnoiz"나 "bgrrb"로는 암호화될 수 없다.
이 사실만으로는 경우의 수가 너무 많아서 해독 시도는 번번이 실패했다. 그러던 중 정보원이 평문 한 문장을 손에 넣었다. 이 평문은 우리가 초창기부터 모아 온 암호문 중 정확히 하나에 대응할 가능성이 아주 높다.
평문 한 문장과 암호문 목록이 주어진다. 이 자료로 a부터 z까지 26개 알파벳의 치환표를 알아낼 수 있는 데까지 알아낸 다음, 최근에 가로챈 통신문 를 해독할 수 있는 만큼 해독해서 출력하는 것이 당신의 임무다.
의 어떤 글자의 해독 결과가 하나로 확정되면 그 문자를 출력해야 한다. 서로 다른 두 문자 이상으로 모순 없이 해독될 수 있으면 그 자리에 '?'를 출력한다.
목록에서 평문에 대응하는 암호문이 둘 이상이면 어느 암호문으로 치환표를 만들어야 할지 알 수 없다. 이때도 일부 문자는 여전히 하나로 확정될 수 있으니 주의하라.
입력
첫 줄에 테스트 케이스의 수 가 주어진다. ()
각 테스트 케이스는 다음과 같이 구성된다.
- 정수 (): 암호문의 개수
- 이어지는 개의 줄: 암호문
- 다음 한 줄: 평문
- 다음 한 줄: 해독하려는 통신문
모든 문자열은 길이가 1 이상 1000 이하이고 알파벳 소문자로만 이루어져 있다.
출력
각 테스트 케이스마다 의 해독 결과를 한 줄에 출력한다.
하나로 확정되는 문자는 해독된 문자를, 확정되지 않는 문자는 '?'를 출력한다. 평문에 대응하는 암호문이 목록에 하나도 없으면 해독 결과 대신 "IMPOSSIBLE"을 출력한다.