문제
영어 문장을 특수한 암호화 규칙으로 변환하는 문제다. 모음(a, i, y, e, o, u)은 3칸, 자음은 10칸 순환 이동시키는 방식으로 각 문자를 치환한다. 대소문자 각각 독립적으로 처리한다.
입력
- 여러 줄의 영어 문장 (EOF까지)
- 영문자, 공백, 기타 문자 포함 가능
출력
- 각 줄에 대해 암호화된 결과를 출력
- 영문자가 아닌 문자는 그대로 출력
예제
| 입력 | 출력 |
|---|---|
Hello World | Dibby Wbrld |
풀이
모음 6개와 자음 20개를 별도의 순환 배열로 관리하고, 각 문자의 이동 폭이 다른 치환 암호를 str.maketrans로 일괄 적용하는 문자열 변환 문제다.
- 소문자 모음(
aiyeou), 대문자 모음, 소문자 자음(bkxznhdcwgpvjqtsrlmf), 대문자 자음 네 그룹을 정의한다. - 모음은 3칸, 자음은 10칸씩 해당 그룹 내에서 순환 이동하는 매핑 딕셔너리를 구성한다.
str.maketrans로 변환 테이블을 만들어 한 번에 치환한다.- EOF까지 각 줄을 읽어
translate로 변환 후 출력한다.
핵심 아이디어: 모음과 자음이 서로 다른 순환 주기를 가지므로, 각 그룹을 독립된 순환 배열로 분리하여 (i + shift) % n 인덱스로 치환 매핑을 미리 만들어 두면 O(1) 변환이 가능하다.
코드
import sys
vowels_lower = "aiyeou"
vowels_upper = "AIYEOU"
consonants_lower = "bkxznhdcwgpvjqtsrlmf"
consonants_upper = "BKXZNHDCWGPVJQTSRLMF"
mapping = {}
for seq, shift in [
(vowels_lower, 3),
(vowels_upper, 3),
(consonants_lower, 10),
(consonants_upper, 10),
]:
n = len(seq)
for i in range(n):
mapping[seq[i]] = seq[(i + shift) % n]
trans = str.maketrans(mapping)
for line in sys.stdin:
print(line.translate(trans), end="")복잡도
- 시간: O(L) — 입력 전체 문자 수 L에 대해 선형 처리
- 공간: O(1) — 매핑 테이블은 고정 크기 (알파벳 52자)