2447 - 별 찍기 - 10

📚 2447 - 별 찍기 - 10

별 찍기 - 10

 

이해

재귀적인 패턴으로 별을 찍는다.
평소에는 반복문 위주로 사용하여, 이번 문제는 재귀를 이용하여 풀었다.

설명 잘되어 있는 블로그

현재 n = 3^i일 때, 가운데를 제외한 나머지는 n = 3^(i-1)이다.

n이 3^i일 때

***
**
***

➡️ * : 3^(i - 1)이다.

 

위를 이용하여 재귀함수를 구현하였다.
재귀말고, 배열로만 결과를 낼 수도 있다. (위 블로그 참고하면 된다.)

소스

import sys

sys.setrecursionlimit(2 ** 8)

read = sys.stdin.readline

n = int(read())

# 빈 배열을 생성한다.
# 초기 값은 빈 공간으로 준다.
pattern = [[' '] * n for _ in range(n)]


# 시작 점 (0, 0, n)을 준다.
# -- recursion 함수 --
# 매개변수 (x, y, multiple)
# multiple : 3의 배수
def recursion(cur_x, cur_y, cur_n):
    # 만약, multiple가 1이라면 현재 위치는 *를 찍는 공간이다.
    if cur_n == 1:
        pattern[cur_x][cur_y] = "*"
        return

    # 아니라면, 다음 차례를 위해 multiple을 3으로 나누어 다음 차례 3의 배수 값을 얻는다.
    cur_n //= 3

    # 이제 for문을 돌리는데 패턴 구간을 돌린다. x, y좌표로 문제에 나와있는 패턴 처럼
    # i : 0 ~ 2까지, j : 0 ~ 2까지
    # 만약 (1, 1)은 비워야 하는 점이기에 패스하고 나머지는 재귀함수를 돌린다.
    # 재귀 (x + (i * 3으로 나눈 muliple), y + (j * 3으로 나눈 muliple), 3으로 나눈 multiple)
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                continue
            else:
                recursion(cur_x + (i * cur_n), cur_y + (j * cur_n), cur_n)


# -- recursion 함수 --
recursion(0, 0, n)

# 이제 출력을 한다.행렬로 출력을 한다.
for in_pattern in pattern:
    print(''.join(map(str, in_pattern)))

 

채점 결과

좋은 웹페이지 즐겨찾기