문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3^k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1
27
예제 출력 1
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
나의 풀이
n = int(input())
stars = [[" " for _ in range(n)] for _ in range(n)]
def star_print(size,x,y):
if size == 1:
stars[x][y] = '*'
return
size = size // 3
for i in range(3):
for j in range(3):
if i == 1 and j == 1: continue
star_print(size,x+i*size,y+j*size)
star_print(n,0,0)
for s in stars:
print(''.join(s))
재귀 함수의 인자로 한 칸의 크기, x좌표, y좌표를 받는다. N×N의 격자를 채우기 위해 N/3×N/3 → N/9×N/9 → ... → 9×9 → 3×3 → 1×1의 격자를 채운다. 따라서 재귀 함수의 탈출 조건을 사이즈로 1을 받아오는 경우로 정한다. 사이즈로 1이 들어오면 해당 좌표를 별로 채우고 사이즈가 1이 아니면 8칸의 서로 다른 좌측 상단 좌표와 1/3한 사이즈의 함수를 재귀 호출해 준다.

다른 사람의 풀이
num = int(input())
def star(n):
if n == 1: return ['*']
stars = star(n//3)
L = [] # 별을 출력할 리스트
for s in stars: L.append(s*3) # 상 구간
for s in stars: L.append(s+' '*(n//3)+s) # 중 구간
for s in stars: L.append(s*3) # 하 구간
return L
print('\n'.join(star(num)))
구간을 상중하로 나누어 재귀함수를 통해 구해진 별을 붙여 나감.

반응형
'알고리즘 > 백준' 카테고리의 다른 글
| [백준] 2225번 [다이나믹 프로그래밍] 합분해 (0) | 2022.01.03 |
|---|---|
| [백준] 1018번 [브루트 포스] 체스판 다시 칠하기 (0) | 2021.12.26 |
| [백준] 2343번 [이분탐색] 기타 레슨 (0) | 2021.12.13 |
| [백준] 1002번 [기본수학2] 터렛 (0) | 2021.12.08 |
| [백준] 3055번 [bfs] 탈출 (0) | 2021.12.06 |
