# 내 풀이
n = int(input())
l = [['' for i in range(n)] for i in range(n)]
def blank(n, x, y):
for i in range(n):
for j in range(n):
l[x-n//2+i][y-n//2+j] = ' '
def f(n, x, y):
if n == 3:
l[x-1][y-1] = '*'
l[x-1][y+0] = '*'
l[x-1][y+1] = '*'
l[x+0][y-1] = '*'
l[x+0][y+0] = ' '
l[x+0][y+1] = '*'
l[x+1][y-1] = '*'
l[x+1][y+0] = '*'
l[x+1][y+1] = '*'
else:
f(n//3, x-n//3, y-n//3)
f(n//3, x + 0, y-n//3)
f(n//3, x+n//3, y-n//3)
f(n//3, x-n//3, y)
blank(n//3, x, y)
f(n//3, x+n//3, y)
f(n//3, x-n//3, y+n//3)
f(n//3, x + 0, y+n//3)
f(n//3, x+n//3, y+n//3)
f(n, n//2, n//2)
for i in l:
s = ''
for j in i:
s += j
print(s)
1. 정답은 리스트 l에 저장된다.
2. blank함수는 가로, 세로 길이가 n이고 중심이 (x, y)인 정사각형을 모두 공백문자 ' '로 채워주는 함수이다.
3. f 함수는 가로, 세로 길이가 n이고 중심이 (x, y)인 정사각형을 문제의 답처럼 문자들을 채워주는 함수이다.
1) n = 3은 재귀를 종결시키는 조건이다.
2) 리스트는 mutable한 변수라서, 리스트 l을 함수 안에서 사용해도 전역 변수처럼 사용된다.
# 다른 사람 풀이
def draw_stars(n):
if n==1:
return ['*']
Stars=draw_stars(n//3)
L=[]
for star in Stars:
L.append(star*3)
for star in Stars:
L.append(star+' '*(n//3)+star)
for star in Stars:
L.append(star*3)
return L
N=int(input())
print('\n'.join(draw_stars(N)))
1. 함수 draw_stars는 n * n 크기의 정답을 생성해주는 함수이다.
1) 재귀의 종료 조건은 n = 1인 상황으로, * 하나를 리스트에 담아서 반환한다.
2) 재귀의 종료 조건에 도달하지 않았다면 n을 3으로 나눈 뒤 재귀호출하여 그 결과를 Stars 변수에 담는다.
3) Stars에 있는 요소들을 하나씩 꺼내어 star에 담아 for문을 실행한다.
4) for문을 수행하고나면 빈 리스트였던 L에 값이 담기게 되고, 이 리스트 L을 반환한다.
2. draw_stars(N)의 결과 반환된 리스트는 각 요소 사이를 줄바꿈 문자 '\n'으로 연결하여 출력한다.
728x90
반응형
'Algorithm > BaekJoon' 카테고리의 다른 글
(파이썬) 백준 11286번 "절댓값 힙" (0) | 2022.04.21 |
---|---|
(파이썬) 백준 11729번 "하노이 탑 이동 순서" (0) | 2022.04.21 |
(파이썬) 백준 1316번 "그룹 단어 체커" (0) | 2022.04.20 |
(파이썬) 백준 1157번 "단어 공부" (0) | 2022.04.20 |
(파이썬) 백준 11720번 "숫자의 합" (0) | 2022.04.20 |