재귀는 늘 새롭다. 이 문제의 경우 분할과 정복 느낌으로 접근해봤다. 이때, 항상 조심해야 할 점이 재귀 함수 내에서 기준점이 되는 좌표를 잘 설정해야 한다는 것이다.
우선 nxn 크기의 배열 원소를 모두 ⭐로 채운다. 재귀함수의 기준점 si, sj는 9등분한 정사각형의 시작점이 된다. 제일 바깥의 중첩 반복문은 9등분한 정사각형의 시작점을 방문한다. 단, 정중앙 정사각형의 시작점인 경우는 해당 n//3xn//3 만큼을 ⭐을 빈 문자열로 바꾼다. 정중앙이 아닌 경우는 해당 구간의 시작점을 인자로 하여 재귀함수를 호출한다. 물론 재귀함수 호출 시 크기도 n//3로 줄여야 한다.
import sys
input=sys.stdin.readline
def recursion(si,sj,n):
if n==1:
return
for i in range(si,si+n,n//3):
for j in range(sj,sj+n,n//3):
if i==si+n//3 and j==sj+n//3:
for k in range(i,i+n//3):
for s in range(j,j+n//3):
arr[k][s]=' '
else:
recursion(i,j,n//3)
n=int(input().rstrip())
arr=[['*']*n for _ in range(n)]
recursion(0,0,n)
for row in arr:
print(''.join(row))