728x90
반응형

Summary

이 문제를 보자마자 문자열의 인덱스에 대한 이해와 join() 함수 그리고 center() 함수를 사용해서 풀면 되지 않을까 하는 생각이 들었다.

 

문제를 풀기 전에 Rangoli 가 궁금해서 무엇인지 찾아봤다.
인도의 전통 문양이라고 하고 아래와 같은 패턴을 가지고 있어서 이 문제의 이름을 Rangoli 라고 지은게 아닌가 싶었다.

 

다시 돌아와
우선 알파벳을 가져와 문자열로 저장해주었다.

import string

alpha = string.ascii_lowercase

알파벳 소문자를 가져오는 방법에는 여러가지가 있어서 생각나는 대로 가져오면 된다.
나는 구글링을 통해 string 라이브러리를 사용해서 알파벳 소문자를 가져왔다.

 

그리고 알파벳을 문제가 원하는 순서에 맞게 출력을 하려고 반복문을 사용해서 문자열 인덱스 슬라이싱을 통해
역순으로 출력하고나서 다시 원래의 순서대로 출력해서 두 개의 문자를 합쳐주었다.

for n in range(size-1, -size, -1):
        al = alpha[size-1:abs(n):-1] + alpha[abs(n):size]

이때, 크기를 5라고 했을 때 반복문의 범위는 4 부터 -4 까지로 정했다.
그 이유는 크기가 5라고 하면 문자열은 "abcde" 가 되는데 문제를 보면 알 수 있듯이 처음에 "e" 부터 출력을 해야한다.

 

"e" -> "ede" -> edcde" -> "edcbcde" -> ebcbabcde"

 

그래서 마지막 문자열의 인덱스를 가져와서 출력해주고 서서히 범위를 늘려가면서 출력해주었다.
그리고 마이너스 인덱스의 경우 역순의 인덱스를 가져오기 때문에 abs() 라는 빌트인 함수를 사용해서 절대값으로 만들어주었다.
그 결과 아래의 사진처럼 출력되는 것을 확인할 수 있었다.

 

이제 이렇게 출력한 문자에 가운데 "-" 를 넣어주어야 한다. 그래서 join() 함수를 사용해서 "-" 를 넣어주었다.

for n in range(size-1, -size, -1):
        al = alpha[size-1:abs(n):-1] + alpha[abs(n):size]
        str = '-'.join(al)

그러면 아래와 같이 결과가 나오는 것을 확인할 수 있다.

이제 그럼 문자가 없는 부분에 "-" 를 넣어주면 문제에서 원하는 결과를 얻을 수 있다.
그리고 문자들은 가운데로 정렬이 되어야하기 때문에 center() 함수를 사용해서 가운데로 정렬해주고 나머지는 "-" 로 채워주었다.

for n in range(size-1, -size, -1):
        al = alpha[size-1:abs(n):-1] + alpha[abs(n):size]
        str = '-'.join(al)
        print(str.center(size*4-3, '-'))

이때 길이는 크기 * 4 - 3 이 된다.
그 이유는 크기가 5라고 했을때 알파벳만 출력하면 5*2 -1 = 9 가 되고 "-" 는 5 * 2 - 2 의 개수만큼 들어가게 된다.
따라서, 크기 * 2 * 2 - 1 - 2 => 크기 * 4 - 3 의 길이가 된다.

그렇게 출력하게 되면 다음과 같이 출력이 된다.

 

내가 푼 방법 말고도 다른 방법이 있는지 찾아봤는데 역시 이 문제를 푸는데 많은 방법들이 있는 것 같았다.ㅎㅎ
다른 방법으로도 풀어보는 것도 재밌을 것 같다.

 

Problem

 

 

Submit Code

import string

def print_rangoli(size):
    # your code goes here
    alpha = string.ascii_lowercase
    
    for n in range(size-1, -size, -1):
        # n = 4 3 2 1 0 -1 -2 -3 -4
        al = alpha[size-1:abs(n):-1] + alpha[abs(n):size]
        str = '-'.join(al)
        print(str.center(size*4-3, '-'))
    

if __name__ == '__main__':
    n = int(input())
    print_rangoli(n)

 

 

Result

728x90
반응형
복사했습니다!