[백준, BOJ 2447] 별 찍기 - 10 (python)
Problem Solving/BOJ

[백준, BOJ 2447] 별 찍기 - 10 (python)

728x90

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net


문제

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.

728x90

예제 입력 1

27

예제 출력 1


내 생각

재귀 함수 문젠데 재귀로 못풀었다.

우선, 3 x 3 패턴은 리스트에 저장해둔다.

* * *
*   *
* * *

다음으로 3 x 3 패턴을 8개 덧붙여 9 x 9 패턴으로 만든다.

* * * * * * * * *
*   * *   * *   *
* * * * * * * * *
* * * * * * * * *
*   * *   * *   *
* * * * * * * * *
* * * * * * * * *
*   * *   * *   *
* * * * * * * * *

5번째 3 x 3 패턴에는 공백이 와야 한다.

* * * * * * * * *
*   * *   * *   *
* * * * * * * * *
* * *       * * *
*   *       *   *
* * *       * * *
* * * * * * * * *
*   * *   * *   *
* * * * * * * * *

다음으로 27 x 27, ... 모두 이와 같이 패턴을 더 해주는 형식으로 하였다.

N = int(input())
ans = [[]]

for i in range(3):
    ans.append([])
    
    # 3x3 패턴 만들기
    for j in range(3):
        if (i == 1) and (j ==1):
            ans[i].append(' ')
        else:
            ans[i].append('*')

if (N != 3):
    n = 9
    while(n <= N):
        # n x (n/3) 패턴 만들기 
        for i in range(int(n/3)):
            for j in range(int(n/3), n):
                ans[i].append(ans[i % int(n/3)][j % int(n/3)])
        # n x (n/3) 패턴을 2번 이어 붙이기
        for i in range(int(n/3), n):
            ans.append([])
            for j in range(n):
                ans[i].append(ans[i % int(n/3)][j % int(n/3)])
        # 패턴의 중앙을 공백 처리하기
        for i in range(int(n/3), int(n/3)*2):
            for j in range(int(n/3), int(n/3)*2):
                ans[i][j] = ' '
        n *= 3

for i in range(N):
    for j in range(N):
        print(ans[i][j], end='')
    print()

 

처음에는 아래와 같이 풀었는데, 시간 초과가 걸렸다.

n x n 짜리 배열을 만들어 모두 '*'로 채운 뒤,

n 패턴에서 공백 처리해야할 부분 확인 -> n/3 패턴에서 공백처리 해야 할 부분 확인 -> ... -> 3 패턴에서 공백처리 해야 할 부분 처리

이런 방식으로 푸니까 n=3^k 일 때, n x n 배열을 k번 씩 돌며 확인을 해서 시간이 많이 걸린 것 같다.

(답이 나오긴 함.)

N = int(input())
ans = [[]]

# 모두 '*'로 채워진 27x27 배열을 만든다.
for i in range(0, N):
    ans.append([])
    for j in range(0, N):
        ans[i].append('*')

n = N
while (n >= 3):
    for i in range(0, N):
        if (((i % n) // (int(N/3))) == 1):
            for j in range(0, N):
                if (((j % n) // (int(N/3))) == 1):
                    ans[i][j] = ' '
    n = int(N/3)

for i in range(0, N):
    for j in range(0, N):
        print(ans[i][j], end='')
    print()
728x90