기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2447번 _ 별 찍기 - 10 본문

백준(Python)/재귀(recursion)

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2447번 _ 별 찍기 - 10

mingchin 2022. 2. 6. 23:23
728x90
반응형

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

[문제]

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.

[아이디어]

1) 같은 모양을 반복해서 그린다.

2) n번째 모양을 기준으로 (n+1)번째 모양을 만들기 위해서는 n번째 모양 8개를 3번에 걸쳐 이어 붙이면 된다. 첫 3개의줄과 마지막 3개의 줄에는 n번째 도형을 3개 이어 붙이고, 가운데 3개의 줄에는 중앙에 빈 공간을 두고 2개를 더하여 붙이면 된다. 이때 빈 공간의 길이는 n번째 도형의 한 줄의 길이와 같다.

 

# 별찍기 10
n = int(input())
d= {3:['***','* *','***']}
def answer(n):
    if n ==3:
        return d[3]
    else:
        if n not in d:
            a = answer(n//3)
            tmp = [3*x for x in a]
            d[n] = tmp + [x+' '*len(x)+x for x in a] + tmp
        return d[n]

print(*answer(n), sep = '\n')
728x90
반응형