HwangHub

[백준 / Python] #1718. 암호 본문

workspace/알고리즘

[백준 / Python] #1718. 암호

HwangJerry 2023. 2. 7. 14:38
 

1718번: 암호

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

www.acmicpc.net

문제 풀이

평문과 암호화 키를 받고, 평문을 iterator로 보면서 문자를 만날 때마다 암호화 키를 이용하여 인코딩하면 되는 문제다.

 

1. 평문과 암호화 키를 리스트로 입력받는다.

2. 암호화 키는 평문과 달리 계속 반복될 여지가 있으므로 그 인덱스 값을 나타내기 위해 k_idx 변수를 추가하였다.

3. loop를 통해 평문의 각 인덱스의 character를 변수 x에 저장하고, x가 문자이면 암호화를 진행하고 공백이면 패스한다. 이 때, 공백인 경우에도 암호화 키는 다음 키로 넘어가야 하므로 k_idx++ 처리까지는 해준다.

4. x가 문자인 경우 카이사르 암호화와 비슷한 방식으로 처리해주면 된다. 암호화 키를 계산할 때 a가 1이 되어야 하므로 96을 빼 주는 것으로 진행하였다.

 

첫 번째 시도

cipher = list(input())
code = list(input())
k_idx = 0
for i in range(len(cipher)):
    x = ord(cipher[i])
    if 97 <= x <= 122:
        x -= (ord(code[k_idx % 4]) - 96)
        k_idx += 1
        if x < 97: x += 26
        cipher[i] = chr(x)
    else : k_idx += 1
print(''.join(cipher))

로직상 문제가 없다고 생각했는데, 런타임에러(indexError)가 떴다. "어디서 인덱스가 나가는거지?" 하고 있었는데, 너무 어이없게도 암호화 키의 길이를 4라고 단정짓고서 cnt%4라고 써놨던 걸 확인할 수 있었다. 내가 설계한 로직대로라면 저 부분은 암호화 키의 길이를 연산값으로 하여 나머지 값을 구하는 부분이었다. 따라서 아래와 같이 수정하였더니 정답임을 확인할 수 있었다.

두 번째 시도

cipher = list(input())
code = list(input())
k_idx = 0
for i in range(len(cipher)):
    x = ord(cipher[i])
    if 97 <= x <= 122:
        x -= (ord(code[k_idx % len(code)]) - 96) # edited
        k_idx += 1
        if x < 97: x += 26
        cipher[i] = chr(x)
    else : k_idx += 1
print(''.join(cipher))
Comments