문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

 

***

* *

***

 

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

 

코드

n = int(input())
star = ["***","* *","***"]

def make_stars(x):
    matrix=[]
    for i in range(3 * len(x)): 
        if i // len(x) == 1:
            matrix.append(x[i % len(x)] + " " * len(x) + x[i % len(x)]) 
        else:
            matrix.append(x[i % len(x)] * 3)
    return(list(matrix))

k = 0
while n != 3:
    n = int(n / 3)
    k += 1
    
for i in range(k):
    star = make_stars(star)
for i in star:
    print(i)

 

Divide and conquer 문제입니다.

 

가장 작은 별인 

 

***

* *

*** 가 반복되므로 이를 담는 리스트를 만듭니다.

 

별이 3개 일때는 그대로 출력하고 2개일때는 가운데 칸을 제외하고 출력합니다.

 

반복하는 여기서 k는 (입력받은 n의 지수) - 1 입니다.

18, 19번째 줄에서 k번 만큼 반복합니다.

n = 27일 때, 처음에는 n = 9일 때를 먼저 star에 저장하고 다시 반복하여 n = 27일 때의 패턴을 star에 저장, 출력합니다. (재귀를 이용하듯이) 4번째 줄은 가운데에 빈 공간을 만들기 위한 조건문입니다.

 

복사했습니다!