본문 바로가기
코딩테스트/[python]정올

[python] 정올 1880 : 암호풀기(Message Decoding)

by o_oo 2022. 4. 21.

서론

암호학 기초 공부하는 기분이었다.


문제

 

JUNGOL

 

www.jungol.co.kr

문제

최근 농부 창호에게서 메시지를 암호화(encryption)에 대해서 배운 소들은 너무나 신이 나있다. 

그들은 다른 농장의 소들과 미팅을 할 때 은밀한 메시지를 사용할 경우 이 방법을 사용할 수 있을 것이라고 생각했다. 

소들이 사용하는 암호화 방법은 복잡한 DES 혹은 BlowFish 와 같은 좋은 방법이 아니고 단순히 치환 하는 암호화 기법이다.


소들의 경우 복호화(암호를 해독함)하는 시간이 오래 걸리기 때문에, 

소들과 대화를 할 수 있는 당신에게 복호화 키와 암호 문자를 입력으로 받아 원문을 구하는 프로그램을 구현 해주기를 요청했다.


복호화 키는 26개의 소문자로 주어지며, a,b,c,d... 를 순서대로 복호화 키 문자로 대치한다는 것을 뜻한다.

 

예를 들어, 복호화 키가 "eydbkmiqugjxlvtzpnwohracsf" 와 같이 주어진다고 하자, 

그러면 이는 다음과 같다 - a 문자는 e, b 문자는 y, ..., z 문자는 f로 바꿔 준다.

암호화 된 문자는 대소문자 혹은 공백이 올 수 있고 대문자는 대문자로 소문자는 소문자로 치환 규칙에 맞게 출력하고, 공백문자는 그대로 출력한다.

입력형식

첫 줄에는 복호화 키가 26개의 소문자로 주어지고, 다음 줄에는 암호화 된 문자가 최대 80 문자로 입력된다.

출력형식

암호화 된 문장을 복호화 시켜 원문을 출력한다.


나의 풀이

key=input()
key+=' '
c=input()

for i in c:
    print(key[min(abs(ord(i)-65), 26)].upper() if 65<=ord(i)<=90 else key[min(abs(ord(i)-97), 26)], end='')

처음 문제를 잘못 이해하여 복호화가 아닌 암호화 코드를 작성하는 실수를 저질렀다.

 

아무튼, key 맨뒤엔 공백을 넣어주었다. 이는 공백은 무조건 공백으로 그대로 출력하기에 이를 처리하기 위함이다.

 

c라는 암호문을 for loop을 이용하여 한글자씩 확인하는데 문제 해결에 아스키 코드를 활용했다. 글자에 일정값을 빼서 key의 자리수에 맞는 알파벳을 출력하여 복호화를 진행한다.

 

if 65<=ord(i)<=90를 통해 대소문자를 판별하였다. 대문자일 경우 65를 빼서 복호화를 진행하고, 소문자의 경우 97을 빼서 복호화를 진행한다. 여기서 특이한 점이라면 min(__, 26)을 한것인데 key의 26은 이전에 붙여두었던 공백이다. 즉, 공백에 65나 97을 빼면 무조건 음수가 나오는데 이를 절대값(abs) 변환을 하면 무조건 26보단 큰 수가 나오고 min을 통해 공백일 경우 key의 26번째인 공백이 나오게 한것이다.


+ 피드백과 새로운 풀이 방법은 언제든지 환영입니다!

댓글