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

파이썬으로 알파벳 란골리(Rangoli) 패턴 출력하는 프로그램 만들기

알파벳 란골리 패턴이란?

란골리(Rangoli)는 인도의 전통 바닥 장식 예술로, 대칭적인 아름다운 패턴이 특징입니다. 프로그래밍에서도 이러한 대칭 패턴을 콘솔에 출력하는 문제가 자주 등장합니다.

숫자 n이 주어졌을 때, n x n 크기의 알파벳 란골리 패턴을 생성해야 합니다. 이때 n은 반드시 1 이상 26 이하의 값이어야 하며, n이 26일 경우 'a'로 시작해서 'z'로 끝나는 전체 알파벳 패턴이 완성됩니다.

입력과 출력 예시

예를 들어 입력값이 5라면 다음과 같은 출력 결과를 얻습니다.

--------e--------
------e-d-e------
----e-d-c-d-e----
--e-d-c-b-c-d-e--
e-d-c-b-a-b-c-d-e
--e-d-c-b-c-d-e--
----e-d-c-d-e----
------e-d-e------
--------e--------

패턴의 중앙 행에는 가장 작은 문자 'a'가 위치하고, 중앙에서 멀어질수록 더 큰 문자들이 대칭 형태로 배치됩니다. 각 문자 사이에는 하이픈(-)이 구분자로 들어갑니다.

해결 알고리즘

이 문제는 패턴을 위쪽 절반과 아래쪽 절반으로 나누어 해결할 수 있습니다.

1단계: 위쪽 절반 출력 (i를 n-1부터 0까지 감소)

  • 왼쪽 여백: j를 0부터 i-1까지 반복하며 "--"를 출력합니다.
  • 내림차순 문자열: j를 n-1부터 i+1까지 감소시키며, ASCII 코드가 j+97인 문자와 하이픈 "-"를 함께 출력합니다.
  • 오름차순 문자열: j를 i부터 n-1까지 반복합니다. j가 n-1이 아니면 문자와 하이픈을, j가 n-1이면 줄바꿈 없이 문자만 출력합니다.
  • 오른쪽 여백: j를 0부터 2*i-1까지 반복하며 "-"를 출력합니다.
  • 한 줄을 완성한 후 줄바꿈합니다.

2단계: 아래쪽 절반 출력 (i를 1부터 n-1까지 증가)

  • 위쪽 절반과 동일한 로직을 적용하되, i를 1부터 n-1까지 증가시키며 대칭 형태로 출력합니다.

핵심 아이디어는 chr(j+97) 함수를 활용하는 것입니다. ASCII 코드에서 소문자 'a'는 97이므로, 숫자 j에 97을 더한 값을 chr() 함수에 넣으면 해당하는 알파벳 문자를 얻을 수 있습니다.

구현 코드

아래는 파이썬으로 구현한 전체 코드입니다.

def solve(n):
    # 위쪽 절반 출력
    for i in range(n-1, -1, -1):
        for j in range(i):
            print(end="--")
        for j in range(n-1, i, -1):
            print(chr(j+97), end="-")
        for j in range(i, n):
            if j != n-1:
                print(chr(j+97), end="-")
            else:
                print(chr(j+97), end="")
        for j in range(2*i):
            print(end="-")
        print()
    # 아래쪽 절반 출력
    for i in range(1, n):
        for j in range(i):
            print(end="--")
        for j in range(n-1, i, -1):
            print(chr(j+97), end="-")
        for j in range(i, n):
            if j != n-1:
                print(chr(j+97), end="-")
            else:
                print(chr(j+97), end="")
        for j in range(2*i):
            print(end="-")
        print()

n = 8
solve(n)

입력

8

출력

--------------h--------------
------------h-g-h------------
----------h-g-f-g-h----------
--------h-g-f-e-f-g-h--------
------h-g-f-e-d-e-f-g-h------
----h-g-f-e-d-c-d-e-f-g-h----
--h-g-f-e-d-c-b-c-d-e-f-g-h--
h-g-f-e-d-c-b-a-b-c-d-e-f-g-h
--h-g-f-e-d-c-b-c-d-e-f-g-h--
----h-g-f-e-d-c-d-e-f-g-h----
------h-g-f-e-d-e-f-g-h------
--------h-g-f-e-f-g-h--------
----------h-g-f-g-h----------
------------h-g-h------------
--------------h--------------

코드 설명

n = 8인 경우, 첫 번째 반복문에서 i는 7부터 0까지 감소합니다. i = 0일 때 어떤 여백도 출력하지 않으므로, 'a'부터 'h'까지 모든 문자가 포함된 가장 긴 줄이 중앙에 출력됩니다. 그 후 두 번째 반복문이 1부터 7까지 진행하면서 나머지 아래쪽 대칭 부분을 완성합니다.

이 알고리즘의 시간 복잡도는 O(n²)이며, 각 줄의 길이는 정확히 4n - 3자가 됩니다. 란골리 패턴 문제는 중첩 반복문과 문자 조작 능력을 훈련하기에 좋은 연습 문제이므로, 직접 코드를 변형해 보면서 원리를 익혀보시기 바랍니다.