본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python] 1294번 : 시저의 암호 2

by 빛밤하늘 2021. 9. 28.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

문제는 링크를 통해서 직접 봐주시길 바랍니다.

 

시저의 암호 2

※ 씨저의 암호 원리는 앞의 문제를 참고하세요. 대현이는 씨저의 암호 방식을 이용하여 문장을 만들려고 한다. never trust brutus 를 씨저의 암호로 바꾸면 qhyhu wuxvw euxwxv 이다. 그런데 집중력이 약

codeup.kr

 

 

 

주의해야 할 점

1. readline만 사용해서 입력할 때

readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.

입력값을 int나 float 같이 숫자형 처리를 하지 않고, 문자열 형태 그대로 쓴다면

대부분의 문제에서는 맨 끝의 \n을 떼어주기 위해 rstrip을 사용해야 합니다.

string = sys.stdin.readline().rstrip()

 

2. 시저 암호

이번 문제에서 씨저의 암호 원리는 앞의 문제를 참고하세요라고만 적혀 있습니다.

CodeUp에서 시저의 암호 문제를 검색해보니 1675 : 시저의 암호 1이라는 문제가 있었습니다.

이 문제에 시저 암호에 대한 내용이 나옵니다.

시저 암호에 대해 자세히 알고 싶으면 구글링을 더 해봅시다.

 

시저의 암호 1

암호학에서 시저 암호(Caesar cipher)는 가장 오래된 암호 중 하나이고, 가장 대표적인 대치(substitution) 암호로서 평문 문자를 다른 문자로 일대일 대응시켜 암호문을 만들어 낸다. 시저 암호는 알파

codeup.kr

 

 

예제 설명

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)

 

 

제출 결과

CodeUp 1294번 : 시저의 암호 2에서 코드 제출 결과
CodeUp 1294번 : 시저의 암호 2에서 코드 제출 결과

 

 

느낀 점

문제에 씨저의 암호 원리는 앞의 문제를 참고하세요라고만 적혀 있어서 조금 당황했습니다.

여러 문제들을 풀어보면서 시저 암호에 관한 문제도 몇 번 만났기 때문에 대충 알고 있긴 했으나,

시저 암호 개념에 대해서 자세히 외우고 있지는 않았습니다.

그래서 다른 문제인 1675 : 시저의 암호 1을 찾아보고 개념을 다시 공부해보고 문제를 풀어보았습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

※ 공감 버튼과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍

반응형

댓글