
https://www.acmicpc.net/problem/2447
문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 아래와 같은 패턴이다.

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

입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
조건
시간 제한 1초
메모리 제한 256MB
접근
라며 호기롭게 시작했지만.. 문자열에 +로 계속 추가를 하니깐 자꾸 아래에 문자가 이어져서 이 방법은 포기를 했다😥
그래서 결국 서칭을 해서 여러 고수분들의 코드를 참고하여 아래와 같은 코드를 작성하였다.
코드
import sys
input = sys.stdin.readline
def paintingStar(size):
if size == 1:
return ['*']
stars = paintingStar(size//3)
L = []
for s in stars:
L.append(s*3)
for s in stars:
L.append(s + ' '*(size//3) + s)
for s in stars:
L.append(s*3)
return L
if __name__ == '__main__':
n = int(input())
print('\n'.join(paintingStar(n)))
이 방법은 재귀를 통해서 size를 1까지 만든 후에, 순차적으로 함수를 실행시키는 것이다.
그래서 처음에는 잘 이해가 되지 않았다..
n=9일 때를 예로 들어서 설명해보겠다.
처음 size는 9이기 때문에, size를 3으로 나눈 후에 다시 함수를 호출한다.
이번에도 1이 아니기 때문에 다시 size를 3으로 나눈 후에 호출한다.
이제 size가 1이므로 ['*']를 return해주고, 이는 size가 3인 상태에서의 함수의 stars가 된다.
for문을 통해서 size=3에서의 L은 아래와 같이 된다.

L을 받은 size=9에서 다시 for문을 돌리면 L은 다음과 같이 된다.

원하는 모양이 잘 나온 것을 볼 수 있다!
join()을 사용해 줄바꿈으로 출력한다.
느낀 점 & 배운 점