유형: 재귀함수
작성일시: 11월 12일
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
*** * * ***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
N (N⇒ , 1≤k≤8)
27
첫째 줄부터 N번째 줄까지 별을 출력
*************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * *************************** ********* ********* * ** ** * * ** ** * ********* ********* *** *** *** *** * * * * * * * * *** *** *** *** ********* ********* * ** ** * * ** ** * ********* ********* *************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * ***************************
1) N = 일 때를 생각해본다
# N = 3 *** * * ***
2) N = 일 때의 패턴을 생각해본다.
# N = 9 ********* * ** ** * *** *** * * * * *** *** ********* * ** ** * *********
3) 일반적인 N = 3^i일 때를 생각해본다.
출처 : [백준] 2447 - 별 찍기 - 10 [Python(파이썬)]
import sys sys.setrecursionlimit(10**6) def paint_star(LEN): DIV3 = LEN//3 if LEN == 3: g[1] = ['*', ' ', '*'] g[0][:3] = g[2][:3] = ['*']*3 return paint_star(DIV3) for i in range(0, LEN, DIV3): for j in range(0, LEN, DIV3): if i != DIV3 or j != DIV3: for k in range(DIV3): g[i+k][j:j+DIV3] = g[k][:DIV3] n = int(sys.stdin.readline().strip()) g = [[' ' for _ in range(n)] for _ in range(n)] paint_star(n) for i in range(n): for j in range(n): print(g[i][j], end='') print()
import sys sys.setrecursionlimit(10**6) def append_star(LEN): if LEN == 1: return ['*'] Stars = append_star(LEN//3) L = [] for S in Stars: L.append(S*3) for S in Stars: L.append(S+' '*(LEN//3)+S) for S in Stars: L.append(S*3) return L n = int(sys.stdin.readline().strip()) print('\n'.join(append_star(n)))
나중에 알게 되었지만 나는 2번 풀이대로 문제를 풀었다!
답을 모른 채로 풀어서, 조금은 산만하지만 점차 다듬어갔다.
그리고 완성되지 않았다... 그냥 !!! 일단 올리는 거 먼저 할 거다ㅜ
for i in n:
for j in n:
if i==1 and j==1:
print(" ")
print("*")
print("\n")
→ 문제 발생
함수 내부에서는 print 하지 않는다.
재귀함수 형태로 바꿔준다.
줄 바꿈을 해야 하기 때문에, matrix를 설정하고, 함수 밖에서 print해야 한다.
def star(n):
if n == 1:
return ['*']
star(n / 3): # star(27) -> star(9) -> star(3)
s = n/3
starlist = ['***', '* *', '***']
for i in range s :
starlist.append(' ')
for i in range s :
starlist.append(' ')
for i in range s :
starlist.append(' ')
n= int(input) #입력
print(star(n))#호출
def star(n):
if n == 1:
return ['*']
#starlist = ['***', '* *', '***']
s = int(n / 3) # n=3 -> s = 1, s=3
a = star(s) # a = ['*'] [['***'], ['* *'], ['***']]
for i in range a :
starlist.append(i * 3) #-> ['*' '*', '*']
for i in range a :
starlist.append(i+ ' ' * s + i) # ['*', ' ', '*']
for i in range a :
starlist.append(i*3) #-> [‘*’ ‘*’, ‘*’]
return starlist [['***'], ['* *'], ['***']]