[BOJ] 2447 별 찍기 - 10 바로가기
재귀적인 패턴으로 별을 찍어 보자. 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=3k이며, 이때 1 ≤ k < 8이다.
첫째 줄부터 N번째 줄까지 별을 출력한다.
재귀적인 패턴으로 별을 찍어보자
라는 문구 때문에 재귀를 사용하긴 했지만, 재귀로 구현이 가능한 것들은 대부분 단순 반복문으로도 구현이 가능하기에 평소에는 반복문으로 구현해왔다.*
) 로 구성된 N x N
크기의 배열을 생성한 후 9등분하여 가운데 배열은 공백(' '
) 으로 값을 바꾸고, 나머지 배열은 재귀 함수를 통해 다시 처음부터 진행한다.from sys import stdin
def solution(N):
# '*' 로 구성된 N x N 크기의 배열 생성
arr = [['*'] * N for _ in range(N)]
# 재귀 함수
def func(X, Y, N):
# 현재 패턴의 크기가 3 x 3일 경우
if N == 1:
# 가운데 공백 패턴 생성
arr[Y+1][X+1] = ' '
return
# 현재 패턴의 크기가 3 x 3 이상일 경우
for y in range(3):
for x in range(3):
# 9등분된 배열 중 가운데 배열일 경우
if x == 1 and y == 1:
# 가운데 공백 패턴 생성
for dy in range(Y + N, Y + 2 * N):
for dx in range(X + N, X + 2 * N):
arr[dy][dx] = ' '
# 9등분된 배열 중 가운데 배열이 아닐 경우
else:
# 인자를 변경하여 재귀함수 실행
func(X + x * N, Y + y * N, N // 3)
# 재귀함수 실행
func(0, 0, N//3)
# 패턴 출력
for a in arr:
print(''.join(a))
N = int(stdin.readline())
solution(N)