밑의 링크는 CodeUp에서의 문제 링크입니다.
문제는 링크를 통해서 직접 봐주시길 바랍니다.
주의해야 할 점
1. readline만 사용해서 입력할 때
readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.
입력값을 int나 float 같이 숫자형 처리를 하지 않고, 문자열 형태 그대로 쓴다면
대부분의 문제에서는 맨 끝의 \n을 떼어주기 위해 rstrip을 사용해야 합니다.
string = sys.stdin.readline().rstrip()
2. 시저 암호
이번 문제에서 씨저의 암호 원리는 앞의 문제를 참고하세요라고만 적혀 있습니다.
CodeUp에서 시저의 암호 문제를 검색해보니 1675 : 시저의 암호 1이라는 문제가 있었습니다.
이 문제에 시저 암호에 대한 내용이 나옵니다.
시저 암호에 대해 자세히 알고 싶으면 구글링을 더 해봅시다.
예제 설명
1. 첫 번째 예제
- 입력
never trust brutus
- 출력
qhyhu wuxvw euxwxv
- 설명
입력한 평문은 'never trust brutus'입니다.
중간의 띄어쓰기는 띄어쓰기 그대로이고
알파벳들은 시저의 암호 방식으로 변경해보면 밑의 표와 같습니다.
평문 | n | e | v | e | r | t | r | u | s | t | b | r | u | t | u | s |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |
암호 | q | h | y | h | u | w | u | x | v | w | e | u | x | w | x | v |
따라서 암호문 결과인 문자열 'qhyhu wuxvw euxwxv'를 출력합니다.
생각한 풀이 과정
평문을 입력합니다. 맨 끝의 \n은 떼어줍니다.
평문을 시저의 암호 방식으로 변경한 암호문을 저장할 변수를 선언하고 빈 문자열로 초기화합니다.
plain = stdin.readline().rstrip()
cryptogram = ''
평문의 한 문자씩 반복하는 반복문을 선언합니다.
for char in plain:
- 반복문 내부 시작
현재 문자가 공백이라면, cryptogram에 공백을 추가하고, 다음 문자로 넘어갑니다.
if char == ' ':
cryptogram += ' '
continue
현재 문자를 유니코드로 변경하고 3을 더해
현재 문자에 대한 암호 문자의 유니코드로 만들어 변수에 저장합니다.
crypto_char_uni = ord(char) + 3
현재 문자가 알파벳 x, y, z인 경우 유니코드에 3을 더하면 알파벳 소문자 유니코드의 범위를 초과하므로,
암호 문자의 유니코드가 알파벳 'z'의 유니코드보다 크다면
26을 빼 알파벳 순서를 한 바퀴 돌게 만듭니다.
if crypto_char_uni > ord('z'):
crypto_char_uni -= 26
현재 문자에 대한 암호 문자의 유니코드를 다시 문자로 만들고 cryptogram에 넣어줍니다.
cryptogram += chr(crypto_char_uni)
- 반복문 끝
입력한 평문에 시저의 암호 방법을 통해 만든 암호문을 저장하고 있는 cryptogram의 값을 출력합니다.
print(cryptogram)
제출한 파이썬 코드
# readline을 사용하기 위해 import합니다.
from sys import stdin
# 평문을 입력합니다.
# 맨 끝의 \n은 떼어줍니다.
plain = stdin.readline().rstrip()
# 입력한 평문을 시저 암호를 통해 변경한 암호문을 저장할 변수를 선언합니다.
# 빈 문자열로 초기화합니다.
cryptogram = ''
# 평문의 한 문자씩 반복해봅니다.
for char in plain:
# 현재 문자가 공백이라면
if char == ' ':
# cryptogram에 공백을 추가합니다.
cryptogram += ' '
# 다음 문자로 넘어갑니다.
continue
# 현재 문자를 유니코드로 변경하고 3을 더해
# 현재 문자의 암호 문자의 유니코드로 만들어 변수에 저장합니다.
crypto_char_uni = ord(char) + 3
# 현재 문자가 알파벳 x, y, z인 경우 유니코드에 3을 더하면 소문자 알파벳의 유니코드 범위를 초과합니다.
# 암호 문자의 유니코드가 알파벳 'z'의 유니코드보다 크다면
if crypto_char_uni > ord('z'):
# 암호 문자의 유니코드에 26을 빼 알파벳 순서를 한 바퀴 돌게 만듭니다.
crypto_char_uni -= 26
# 암호 문자의 유니코드를 다시 문자로 만들고 cryptogram에 넣어줍니다.
cryptogram += chr(crypto_char_uni)
# 암호문을 저장하고 있는 cryptogram의 값을 출력합니다.
print(cryptogram)
제출 결과
느낀 점
문제에 씨저의 암호 원리는 앞의 문제를 참고하세요라고만 적혀 있어서 조금 당황했습니다.
여러 문제들을 풀어보면서 시저 암호에 관한 문제도 몇 번 만났기 때문에 대충 알고 있긴 했으나,
시저 암호 개념에 대해서 자세히 외우고 있지는 않았습니다.
그래서 다른 문제인 1675 : 시저의 암호 1을 찾아보고 개념을 다시 공부해보고 문제를 풀어보았습니다.
댓글