본문 바로가기
코딩테스트/파이썬

[python] 제곱암호

by onggury 2023. 6. 15.

문제

제곱암호는 다음과 같은 특징을 가진다.

  • 암호문의 길이가 N이라면, N/2개의 숫자와 N/2개의 알파벳 소문자로 이루어져 있다. 암호문의 길이는 항상 짝수이다.
  • 암호문의 첫 글자는 항상 알파벳 소문자이며, 이후에는 항상 숫자와 알파벳 소문자가 번갈아 가며 등장한다.

제곱암호로 암호화된 문장은 아래 방식을 통해 복호화할 수 있다.

  • 원문은 처음에 비어있는 상태이다.
  • 암호문의 첫 번째 문자부터 순서대로 아래의 복호화 과정을 거친다. 첫 번째 문자는 문장의 가장 왼쪽 문자를 의미한다.
  • i가 홀수일 때, 암호문의 i번째 문자를 알파벳의 사전 기준 다음 문자로 바꾸는 작업을 암호의 i번째 숫자의 제곱번 시행한다. 작업이 끝난 뒤 변환된 알파벳을 원문의 맨 오른쪽에 추가한다. (i번째 숫자는 암호문의 i+1번째 문자에 해당한다.)
  • z에서 사전 기준 다음 문자로 바꿔야 하는 경우에는 a로 바뀌게 된다.
  • 복호화가 끝난 뒤의 원문은 N/2의 길이의 알파벳 소문자로만 이루어진 문자열이다.

제곱암호를 원문으로 복호화 하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에는 암호문의 길이를 의미하는 정수 N이 주어진다.

둘째 줄에는 암호문 S가 주어진다.

  • 4 ≤ N ≤ 200,000 : N은 짝수이다.
  • S는 알파벳 소문자와 1부터 9사이의 숫자로만 이루어져 있다.

 

 

import sys
input = sys.stdin.readline

passLen = int(input())
passStr = input()

result = ""

for i in range(0, passLen, 2):
	s = passStr[i]
	n = int(passStr[i+1])
	
	result += chr((ord(s) - ord('a') + (n*n)) % 26 + ord('a'))
print(result)

 

아스키코드로 해결할 때 'a'는 97임을 잊지말자.

 

 

 

※출처

https://multicampus-kdt.goorm.io/lecture/38996/멀티잇-코딩테스트-러닝클래스-python-6월반