
처음 이 문제를 보았을때는 공백이 들어가야하는 부분의 규칙을 찾아서 공백을 넣어주면 된다고 생각했다.
n = int(input())
ans = [['*']*n for _ in range(n)]
# n이 3의 몇승인지 구함
k = 0
tmp = n
while(tmp > 1 ):
tmp /=3
k += 1
#3x3 사각형에 공백, 9x9 사각형에 공백 이런식이기 때문에 27이라면 3의 3승이므로 3번 반복
for l in range(1,k+1):
sqt = 3**l
for i in range(n):
for j in range(n):
#사각형의 시작점이라면
if i % sqt == 0 and j % sqt == 0:
#해당 사각형의 중간부분을 공백 처리
for x in range(0,sqt//3):
for y in range(0,sqt//3):
if i+x+sqt//3<n and j+y+sqt//3<n:
ans[i+x+sqt//3][j+y+sqt//3] = ' '
for i in range(n):
for j in range(n):
print(ans[i][j], end="")
print()
이런식으로 직관적으로 숫자 규칙에 맞게 풀어주었다.
하지만 이 방법은 추천하지 않는다. 왜냐하면 python으로 선택했을 때에는 시간초과가 발생하였고 pypy3로 해야지 겨우 정답처리가 되었기 때문이다.
이 주소에 나온 방법을 참고하여 작성한 코드는
def draw_stars(n):
if n==1:
return ['*']
Stars=draw_stars(n//3)
answer=[]
print(Stars)
for star in Stars:
answer.append(star*3)
print(answer)
for star in Stars:
answer.append(star+' '*(n//3)+star)
for star in Stars:
answer.append(star*3)
return answer
N=int(input())
print('\n'.join(draw_stars(N)))
이런식으로 재귀함수를 사용해 세 부분으로 나누어 별을 찍어주면 python으로 제출해도 시간초과가 뜨지 않는다.
코딩테스트 였다면 시간초과로 인해 점수를 못받을 수 도 있을 뻔한 문제였다.
더 최적화된 코드로 문제를 풀이하기 위해 많은 공부가 필요한 것 같다.