Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 구현하는 수직 암호: 문자열을 n개 행으로 나누어 세로로 읽는 프로그램

문제 이해하기

문자열 s와 숫자 n이 주어졌을 때, 문자열을 n개의 행으로 재배열하는 문제입니다. 재배열된 결과를 위에서 아래로, 왼쪽에서 오른쪽으로 읽으면 원래 문자열이 복원되며, 이렇게 세로 방향으로 문자를 분산시키는 방식을 수직 암호(Vertical Cipher)라고 합니다. 간단하지만 원래 문장의 형태를 숨기는 기본적인 암호화 기법 중 하나입니다.

예를 들어 입력이 s = "ilovepythonprogramming", n = 5라면, 출력은 다음과 같습니다.

['ipnrn', 'lypag', 'otrm', 'vhom', 'eogi']

동작 원리 시각화

문자열을 한 줄에 5글자씩 왼쪽에서 오른쪽으로 배치하면 다음과 같은 표가 만들어집니다.

i l o v e
p y t h o
n p r o g
r a m m i
n g

이 상태에서 각 열을 위에서 아래로 읽으면 바로 결과 리스트의 요소들, 즉 'ipnrn', 'lypag', 'otrm', 'vhom', 'eogi'가 됩니다.

해결 접근 방법

이 문제는 다음 단계로 해결할 수 있습니다.

  • 빈 리스트 L을 생성합니다.
  • i를 0부터 n-1까지 반복합니다.
  • 각 반복에서 인덱스 i부터 시작해 n칸씩 건너뛰며 문자를 추출한 부분 문자열을 L에 추가합니다.
  • 모든 반복이 끝나면 L을 반환합니다.

파이썬에서는 슬라이싱 문법 s[i::n] 덕분에 이 과정을 한 줄로 처리할 수 있습니다. 이 표현식은 인덱스 i부터 시작해 매 n번째 문자씩 건너뛰며 문자열 끝까지 추출하라는 의미입니다. 리스트 컴프리헨션과 결합하면 전체 로직이 매우 간결해집니다.

구현 예제

아래 예제를 통해 실제 동작을 확인해 보겠습니다.

class Solution:
    def solve(self, s, n):
        return [s[i::n] for i in range(n)]

ob = Solution()
s = "ilovepythonprogramming"
n = 5
print(ob.solve(s, n))

입력

"ilovepythonprogramming", 5

출력

['ipnrn', 'lypag', 'otrm', 'vhom', 'eogi']

정리

이 프로그램의 시간 복잡도는 O(len(s))로, 문자열 길이에 비례하므로 매우 효율적입니다. 슬라이싱과 리스트 컴프리헨션만으로 암호화 로직을 깔끔하게 표현할 수 있다는 점이 파이썬다운 해법이라 할 수 있습니다. 역방향으로 슬라이싱(s[i::n] 결과를 이어 붙인 뒤 같은 규칙으로 재조합)을 활용하면 복호화도 손쉽게 구현할 수 있습니다.