[백준] 2447 - 별찍기 - 10
1. 요약
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, …)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
2. 아이디어
n = 3^1 일때는 가운데를 비워두고 “별”이 찍힌 것처럼 n = 3^i 일때는 가운데를 비워두고 “n = 3^(i-1) 일때의 별 배열”이 찍힌다.
3. 코드
def draw_star(n):
global Map
if n==3:
Map[0][:3] = Map[2][:3] = [1]*3
Map[1][:3] = [1, 0, 1]
return
a = n//3
draw_star(a)
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
continue
for k in range(a):
Map[a*i+k][a*j:a*(j+1)] = Map[k][:a]
N = int(input())
Map = [[0 for i in range(N)] for i in range(N)]
draw_star(N)
for i in Map :
for j in i :
if j :
print('*', end = '')
else :
print(' ', end = '')
print()
References
- https://study-all-night.tistory.com/5
- https://claude-u.tistory.com/146
댓글남기기