View

[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으로 나눠서 재귀 호출 하면 될거같아 보였다

 

728x90
반응형
Share Link
reply