잘못된 안도감
시간 제한2초메모리 제한128 MB
각 줄을 모스 부호로 바꾼 뒤 글자별 길이 숫자를 뒤집어 다시 끊어 원래 문장으로 복원합니다.
문제
프레디는 훨씬 큰 콜리플라워를 키우는 방법을 새로 알아냈다. 동료 정원사 토미에게 이 방법을 넘기고 싶지만 다른 사람이 훔쳐 가는 것은 막고 싶다. 그래서 두 사람은 M. E. Ohaver가 제안한 간단한 암호화 기법을 쓰기로 했다.
이 기법은 모스 부호를 바탕으로 한다. 모스 부호는 문자마다 길이가 다른 점과 선의 나열로 글자를 적는다. 알파벳 대문자 26개의 부호는 다음과 같다.
길이가 4인 조합은 모두 열여섯 가지인데, 실제 모스 부호는 그중 네 가지를 쓰지 않는다. 이 문제에서는 남은 네 가지에 아래 문자를 배정한다. 실제 모스 부호의 배정은 아니다.
메시지에서 문자와 문자 사이는 짧은 쉼으로 구분하고 보통 공백으로 적는다. 그래서 ACM_GREATER_NY_REGION은 이렇게 나간다.
.- -.-. -- ..-- --. .-. . .- - . .-. ..-- -. -.-- ..-- .-. . --. .. --- -.
Ohaver의 방식은 문자 사이의 쉼을 지워 모스 부호를 망가뜨린다. 쉼에는 실제로 정보가 담겨 있다. 모스 부호는 길이가 일정하지 않고 접두 부호도 아니기 때문이다. 쉼을 지운 .--.-.-- 하나만 놓고 보면 ACM, AKW, ANY를 비롯해 108가지 글로 읽힌다. 그래서 이 방식은 점과 선 옆에 각 문자의 부호 길이를 한 자리씩 적은 숫자열을 함께 남긴다. .--.-.-- 242라고 적으면 읽는 방법이 다시 하나로 정해진다.
암호화와 복호화는 똑같은 세 단계를 밟는다.
- 글을 쉼 없는 모스 부호로 바꾸고, 부호 길이를 적은 숫자열을 만든다.
- 숫자열을 뒤집는다.
- 뒤집은 숫자열을 부호 길이로 삼아 점과 선을 자르고, 잘린 조각을 다시 글자로 바꾼다.
암호문 AKADTOF_IBOETATUK_IJN에 이 단계를 밟아 보자. 1단계는 다음을 만든다.
.--.-.--..----..-...--..-...---.-.--..--.-..--...----. 232313442431121334242
2단계에서 숫자열을 뒤집는다.
242433121134244313232
같은 점과 선을 이 길이로 다시 자르면 ACM_GREATER_NY_REGION이 나온다.
이 방식은 그리 안전하지 않지만 프레디는 이만하면 됐다고 여긴다. 프레디를 대신해 이 알고리즘을 구현하라.
입력
입력은 Ohaver의 알고리즘으로 암호화한 메시지 여러 개로 이루어지고, 한 줄에 하나씩 주어진다. 메시지에는 알파벳 대문자 26개와 밑줄, 쉼표, 마침표, 물음표만 나온다. 메시지 하나의 길이는 1000자를 넘지 않는다. 입력은 파일의 끝에서 끝난다.
출력
입력의 메시지마다 복호화한 결과를 한 줄에 하나씩 출력한다.