문제:
Vigenere cipher이라는 암호화 방법은 암호화하려는 문장(평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.
예를 들어 암호화 키가 love이고, 암호화할 문장이 "nice day"라면 다음과 같이 암호화가 이루어진다.
제시된 평문의 첫 번째 문자인 'n'은 해당 암호화 키 'l'의 알파벳 순서가 12이므로 알파벳상의 순서에서 'n'보다 12앞의 문자인 'b'로 변형된다.
변형된 문자가 'a'이전의 문자가 되면 알파벳 상에서 맨 뒤로 순서를 돌린다. 예를 들면 평문의 세 번째 문자인 'c'는 알파벳 상에서 3번째이고 대응하는 암호화키 'V'는 알파벳 순서 22로 'c'에서 22 앞으로 당기면 'a'보다 훨씬 앞의 문자이어야 하는데, 'a' 앞의 문자가 없으므로 'z'로 돌아가 반복되어 'g'가 된다. 즉 평문의 문자를 암호화키의 문자가 알파벳 상에서 차지하는 순서만큼 앞으로 뺀 것으로 암호화한다.
평문의 문자가 공백 문자인 경우는 그 공백 문자를 그대로 출력한다.
이과 같은 암호화를 행하는 프로그램을 작성하시오.
입력:
첫째 줄에 평문이, 둘째 줄에 암호화 키가 주어진다.
평문은 알파벳 소문자와 공백문자(space)로만 구성되며, 암호화 키는 알파벳 소문자만으로 구성된다. 평문의 길이는 공백까지 포함해서 30000자 이하이다.
출력:
첫 번째 줄에 암호문을 출력한다.
풀이방법:
암호화 키와 평문의 차이를 알아야 하므로 ascii코드 값으로 바꿔 주는 ord 함수를 사용한다. 이를 이용해서 암호화 키와 평문의 차이를 구하고 이 값이 0보다 큰지 작은지를 결정한다.
0보다 크다면 해당 차이 값이 96을 더해주도록 한다.(소문자 'a'의 ascii는 97이다.)
만약 작다면 26을 추가로 더해서 뒤에서 부터 이동하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sentence=input()
secret=input()
answer=''
for i in range(len(sentence)):
if sentence[i]==' ':
answer+=' '
continue
diff=ord(sentence[i])-ord(secret[i%len(secret)])
if diff > 0:
answer+=chr(diff+96)
else:
answer+=chr(diff+26+96)
print(answer)
|
cs |
문제링크:
https://www.acmicpc.net/problem/1718
'Algorithm > Python' 카테고리의 다른 글
[BOJ]2863. 이게 분수? (0) | 2020.04.16 |
---|---|
[BOJ]7785. 회사에 있는 사람 (0) | 2020.04.14 |
[BOJ]1302 베스트셀러 (0) | 2020.04.07 |
[BOJ]1051. 숫자 정사각형 (0) | 2020.03.26 |
[BOJ]2644. 촌수계산 (0) | 2020.03.24 |