알파벳 란골리 패턴이란?
란골리(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자가 됩니다. 란골리 패턴 문제는 중첩 반복문과 문자 조작 능력을 훈련하기에 좋은 연습 문제이므로, 직접 코드를 변형해 보면서 원리를 익혀보시기 바랍니다.