[백준/Python] 2447: 별 찍기 - 10

농담곰·2023년 7월 28일

백준

목록 보기
21/33

[백준/Python] 2447: 별 찍기 - 10

n이 입력으로 주어질때 해당하는 프랙탈 패턴을 출력하는 문제이다. 이때 n은 3의 거듭제곱이다.

주어진 패턴을 보면 n = 3일 때의 패턴이 크기가 커지며 반복되고 있다는 것을 알 수 있다. (가운데가 뚫려있는 네모 도넛의 형태?) 9일때는 3의 패턴을 9개 붙여다 놓은 형태이고, 27일때는 9의 패턴을 9개 붙여다 놓은 형태이다.

머리로는 패턴을 이해했는데 재귀함수로의 연상이 어렵다.

재귀 함수로 구현하기 위해서

  1. Base case로 n == 3일때 3x3의 패턴을 리턴하도록 한다.
  2. 만약 n이 3보다 클 경우 재귀함수를 호출하여 3^(n-1)의 패턴을 가져온다. n의 패턴은 3^(n-1)의 패턴을 9개 붙여놓은 형태이기 때문이다.
  3. 이전 패턴을 불러왔다면 그 패턴을 다시 9개 붙여 놓는데, 가운데 부분은 비워놔야 한다. (상단부, 중간부, 하단부를 나눠놓은 이유)
  4. 만들어진 패턴을 리턴한다.

소스코드


import sys

def draw_pattern(n):
    if n == 3:
        pattern = ["***", "* *", "***"]
    else:
        prev_pattern = draw_pattern(n // 3)
        size = n // 3
        pattern = []
        
        # 상단부
        for r in prev_pattern:
            pattern.append(r * 3)
        
        # 중간부 (가운데 공백 포함)
        for r in prev_pattern:
            pattern.append(r + " " * size + r)
        
        # 하단부
        for r in prev_pattern:
            pattern.append(r * 3)
    
    return pattern

# n은 3의 거듭제곱
n = int(sys.stdin.readline())

pattern = draw_pattern(n)
for i in pattern:
    print(i)

0개의 댓글