Notice
Recent Posts
Recent Comments
Link
HwangHub
[백준 / Python] #1718. 암호 본문
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))
'workspace > 알고리즘' 카테고리의 다른 글
[백준/python] #2309 일곱 난쟁이 (0) | 2023.02.12 |
---|---|
[백준 / python] # 15652 N과 M(4) (0) | 2023.02.08 |
[백준 / python] #15820 맞았는데 왜 틀리죠? (0) | 2023.02.05 |
[백준 / Python] #7795 먹을 것인가 먹힐 것인가 (0) | 2023.02.02 |
[백준 / python] #11652 카드 (1) | 2023.02.02 |
Comments