BOJ 2447 : 별 찍기 - 10[python3]

문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
풀이
도저히 모르겠어서, 다른 사람 아이디어를 참고하고 풀었다. https://cotak.tistory.com/38
[백준] 2447 - 별 찍기 - 10 [Python(파이썬)]
문제 www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에..
cotak.tistory.com
1. 여기서 배운 건 재귀는 항상 수렴 조건이 필요하다.
- if condition --> return False or True
2. 그 수렴 조건 까지 반복할 수 있어야 한다.
- if condition --> return Func(condition)
참고한 코드는 결국 수렴 조건에서 별 1개를 뱉어내는 리스트를 만들고, 하나의 별모양 블럭을 출력하지만 중간에 빈 구역을 출력하기 위해서 나머지 추가 조건을 주고, 아래와 같은 배열 수렴 조건의 배열을 뱉어낸다.
['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***', '*********', '* ** ** *', '*********']
그리고 이것을 리스트 분자들 간 join구문을 이용해서 붙여서 활용한다.
또 중요한 재귀 문제를 푸는 것에서 재귀의 깊이를 결정하는 부분인데,
sys.setrecursionlimit(깊이)를 지정해주어야 시간 초과를 받지 않는다.(runtime error)
import sys
sys.setrecursionlimit(10**6) # 재귀 호출 깊이를 늘리는 방법
def stars(N):
if N == 1:
return ['*']
star = stars(N//3)
L = []
for s in star:
L.append(s*3)
for s in star:
L.append(s+' '*(N//3)+s)
for s in star:
L.append(s*3)
return L
if __name__ == '__main__':
N = int(input())
print('\n'.join(stars((N))))