자바어 암호 분석

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

요약
암호문이 주어졌을 때 각 단어 내에서 모음과 자음이 번갈아 나오도록 26개 문자를 두 그룹으로 나눌 수 있는지 그래프 이분 판정으로 확인하고, 가능하다면 사전순으로 가장 작은 복호문을 구성합니다.
난이도

보통10점 중 6점

유형
그래프, BFS, 그리디
정답자
아직 제출이 없습니다

문제

자바어(Javanese)는 인도네시아 자바섬 중부와 동부 사람들이 쓰는 언어이다.

1926년, 자바어를 위해 영어 알파벳을 사용하는 표준 표기법이 만들어졌다. 이 표기법은 A부터 Z까지 26개의 글자를 모두 사용한다. 그중 A, E, I, O, U 다섯 글자는 모음이고, 나머지 21개 글자는 자음이다. 자바어 단어에서는 모음과 자음이 항상 번갈아 나타난다. 즉, 모음 두 개가 붙어 있거나 자음 두 개가 붙어 있는 경우가 절대 없다. 이 성질은 암호화된 자바어 문장을 해독할 때 매우 유용하다.

문장 ss는 여러 단어로 이루어지며, 각 단어는 대문자 알파벳으로만 이루어진다. 문장 ss의 모든 단어에서 모음과 자음이 번갈아 나타나면(모음끼리 인접하거나 자음끼리 인접하지 않으면) 그 문장을 올바른(legitimate) 문장이라고 부른다.

문장 ss에 단순 치환 암호가 적용된다. 즉, 26개 대문자 집합 위의 전단사 함수 ff를 하나 정하고, ss의 각 글자 cc를 f(c)f(c)로 바꿔 암호문 tt를 얻는다. ff가 전단사이므로, 알파벳 26글자 중 정확히 5개가 모음의 상이고 나머지 21개가 자음의 상이다.

암호문 tt가 주어진다. tt로 암호화될 수 있는 올바른 문장 ss가 존재하는지 판단하여라. 가능한 올바른 문장이 여러 개라면, 출력 조건에 정의된 하나의 표준 문장을 출력해야 한다.

입력

입력은 암호문 tt이다. 단어들이 하나의 공백 또는 줄바꿈으로 구분되어 주어진다. 각 단어는 대문자 알파벳(A–Z)으로만 이루어진다.

입력의 전체 길이는 100 000100\,000자를 넘지 않는다.

출력

tt로 암호화될 수 있는 올바른 문장 ss가 존재하지 않으면 impossible 한 단어만 출력한다.

그렇지 않으면 해독한 올바른 문장 ss를 출력하되, tt와 완전히 같은 배치를 유지한다. 즉, 글자만 바꾸고 모든 공백과 줄바꿈은 위치까지 그대로 둔다. tt로 암호화되는 올바른 문장이 여러 개일 수 있는데, 그중 사전순으로 가장 앞서는 문장을 출력한다. 두 후보 문장을 앞에서부터 한 글자씩 비교하여, 처음으로 다른 위치에서 더 작은 글자(A<B<⋯<ZA < B < \dots < Z)를 가진 문장이 더 앞선다. ss의 모든 글자는 대문자이다.

예제2

  1. 예제 1

    입력
    O RISK LIP FOCUS LUCKY
    
    예상 출력
    A BECI DEF GAHOC DOHIJ
    
  2. 예제 2

    입력
    NEERC
    
    예상 출력
    impossible