개발일기

백준 1718번 파이썬 풀이 : 암호 본문

알고리즘 문제풀이/백준

백준 1718번 파이썬 풀이 : 암호

한민기 2021. 9. 20. 22:51
반응형

문제 링크 : https://www.acmicpc.net/problem/1718

 

1718번: 암호

Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변

www.acmicpc.net

문제

Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.

예를 들어 암호화 키가 love이고, 암호화할 문장이 “nice day” 라면 다음과 같이 암호화가 이루어진다.

제시된 평문의 첫 번째 문자인 ‘n’은 해당 암호화 키 ‘l’의 알파벳 순서가 12 이므로 알파벳상의 순서에서 ‘n’보다 12앞의 문자인 ‘b’로 변형된다.

변형된 문자가 ‘a' 이전의 문자가 되면 알파벳 상에서 맨 뒤로 순서를 돌린다. 예를 들면 평문의 세 번째 문자인‘c’는 알파벳 상에서 3 번째이고 대응하는 암호화키 ‘v'는 알파벳 순서 22로 ‘c'에서 22 앞으로 당기면 ‘a'보다 훨씬 앞의 문자이어야 하는데, ‘a’앞의 문자가 없으므로 ‘z’로 돌아가 반복되어 ‘g’가 된다. 즉 평문의 문자를 암호화키의 문자가 알파벳 상에서 차지하는 순서만큼 앞으로 뺀 것으로 암호화한다.

평문의 문자가 공백 문자인 경우는 그 공백 문자를 그대로 출력한다.

이와 같은 암호화를 행하는 프로그램을 작성하시오.

입력

첫째 줄에 평문이, 둘째 줄에 암호화 키가 주어진다.

평문은 알파벳 소문자와 공백문자(space)로 만  구성되며, 암호화 키는 알파벳 소문자만으로 구성된다. 평문의 길이는 공백까지 포함해서 30000자 이하이다.

출력

첫 번째 줄에 암호문을 출력한다.

# 문제 풀이 ( 알고리즘 분류 : 문자열 )

문자열 사용 능력과 아스키코드에 대한 이해가 있다면 쉽게 풀 수 있을 것이라 생각된다.

1
2
3
4
5
6
string = input()
key = input()
answer = ''
alph_dict = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z']
 
key_index = 0
cs

string : 평문을 입력받을 변수

key : 암호화 키를 입력받을 변수

alph_dict : 알파벳 index를 얻기 위한 배열

 

1
2
3
4
for i in string:
    if i == " ":
        answer += " "
        key_index += 1
cs

평문을 하나씩 탐색하며 공백일 때는 공백을 그대로 answer에 추가시켜 주며 key_index (포인터)는 1증가시켜 준다.

 

1
2
3
4
5
6
    else:
        temp = ord(i) - alph_dict.index(key[key_index]) - 1
        if temp < 97:
            temp += 26
        answer += chr(temp)
        key_index += 1
cs

temp 변수에 i를 아스키 코드로 변환 alph_dict 인덱스에서 key에 해당하는 index를 가져와 계산을 해준다.

temp 가 97보다 작으면 알파벳 소문자 a보다 작은 값이기 때문에 26을 더해주어 z부터 다시 시작하게 한다.

계산이 완료되면 chr을 사용하여 다시 알파벳으로 변환 answer에 추가한다.

 

1
2
    if key_index == len(key):
        key_index = 0
cs

key_index가 key의 길이와 같으면 포인터를 맨 처음인 0으로 되돌려 다시 암호화 키부터 시작하게 한다.

 

# 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string = input()
key = input()
answer = ''
alph_dict = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z']
 
key_index = 0
for i in string:
    if i == " ":
        answer += " "
        key_index += 1
    else:
        temp = ord(i) - alph_dict.index(key[key_index]) - 1
        if temp < 97:
            temp += 26
        answer += chr(temp)
        key_index += 1
    if key_index == len(key):
        key_index = 0
print(answer)
cs

 

반응형
Comments