[Python]백준_5426 : 비밀 편지

Alal11·2022년 12월 31일
0
post-thumbnail

출처

https://www.acmicpc.net/problem/5426


문제

선영이는 남자친구를 위해 연애 편지를 썼다. 선영이는 편지가 남들에게 읽히는 것을 막기 위해서 편지를 암호화하려고 한다.

먼저, 편지의 내용을 정사각형에 작성한다. 그 다음, 시계방향으로 90도 회전시킨다. 그 다음, 첫 행부터 마지막 행까지 순서대로 다시 편지를 작성한다. 선영이는 싸이월드 세대이기 때문에, 편지에 띄어쓰기를 쓰지 않는다.

예를 들어, 편지의 내용이 "RosesAreRedVioletsAreBlue"인 경우에, 암호화한 편지는 "eedARBtVrolsiesuAoReerles" 이 된다.

선영이가 암호화한 편지가 주어졌을 때, 원래 내용을 구하는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 수는 최대 100개이다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 암호화된 편지가 주어진다. 편지는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 1보다 크거나 같고, 10,000보다 작거나 같으며, 항상 제곱수이다.


출력

각 테스트 케이스마다 원래 메시지를 출력한다.


예제 입출력


알고리즘 분류

  • 수학
  • 구현
  • 문자열

➡️문제 분석

암호화된 문자 길이의 제곱근은 정사각형의 한 변의 길이가 된다.
따라서 원래 내용을 구할려면,
암호화된 문자 길이의 제곱수만큼 나누어진 각 구간의 끝 문자부터 차례대로 출력하면 된다.

RSTㅡEEOㅡTCP
eedARㅡBtVroㅡlsiesㅡuAoReㅡerles
EarSㅡvyeqㅡeBsuㅡneMa

TOPSECRET
RosesAreRedVioletsAreBlue
SquaresMayBeEven


➡️코드(⭕)

import sys
from math import sqrt

input = sys.stdin.readline

test_case = int(input().rstrip())

for i in range(test_case):

    password = []
    slice_pw = []

    password = input().rstrip()

    one_len = int(sqrt(len(password)))

    munja = []

    cnt = 0
    for j in range(one_len):
        slice_pw.append(password[cnt:cnt+one_len])
        cnt += one_len

    for k in range(one_len-1, -1, -1):
        for q in range(one_len):
            munja.append(slice_pw[q][k])

    print(*munja, sep='')

➡️코드 분석

  1. 제곱근 함수 sqrt를 사용하기 위해 math 모듈을 불러온다.

  2. 테스트 케이스의 수를 빠른 입력으로 입력받고, 그 수 만큼 전체 반복을 해준다.

  3. 암호화된 문자 password를 입력받고, 그 길이의 제곱근을 구해 one_len에 넣어준다.

  4. 첫번째 for문으로 slice_pw 리스트에 암호화된 문자를 one_len만큼 구간을 나눈것을 추가해준다.

  5. 두번째 for문으로 q는 0부터 (one_len 길이-1)까지, k는 one_len 길이부터 0까지 역순으로 반복하여 slice_pw[q][k]를 구해 munja 리스트에 넣어준다.

  6. 마지막으로 munja 리스트의 요소들을 대괄호와 콤마 없이 출력해주면 된다.


➡️end

문제 자체는 쉬웠지만 암호를 복호화 하는 과정을 코드로 구현하는 것이 조금 복잡했다.

0개의 댓글