[Python] Baekjoon 백준 2447번 별 찍기 - 10
[Python] Baekjoon 백준 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번째 줄까지 별을 출력한다.
def star(e):
global star_map, n
s = e // 3
if e <= 0:
return
for i in range(s, n, e):
for j in range(s, n, e):
for k in range(i, i + s):
for l in range(j, j + s):
star_map[k][l] = " "
return star(s)
n = int(input())
star_map = [["*"] * n for _ in range(n)]
star(n)
for i in range(n):
print("".join(star_map[i]))
나는 입력값을 받으면 리스트에 먼저 " * " 을 가득 채운 후에 지우는 방식으로 하려고 생각 하였고
예제 출력을 보면서 어떤패턴으로 지워주면 되는지 찾아보았다
지워진 부분만 표시해보니 3가지패턴을 확인 할 수 있었다
첫번째 패턴
지워진 부분이 1...4...7...10...13...16
여기서 입력이 3이면 +3 씩 건너뛰어 주면서 지워주면 될거같았다
두번째 패턴
3,4,5...12,13,14...21,22,23
여기서는 첫번째와 동일하게 입력값이 9 이면 +9 씩 건너뛰면 될거같았고
시작위치를 입력값 9 // 3 인 위치로 하면 될거같았고
지우는 범위를 입력값9 // 3 한걸 시작값에 더해주면 될거같았다
세번째 패턴
9-17........36-44
마찬가지로 27 입력값일때 27씩 건너뛰면 될거고
시작위치는 입력값 27 // 3 로 잡고
시작 위치에서부터 입력값 27 // 3 한 값을 더한 위치까지 지워주면 될거같았다
세가지 패턴을 보면서
27일때 먼저 처리하고 3으로 나눠서 재귀 호출 하면 될거같아 보였다