[알고리즘] BOJ 2447 별 찍기 - 10 #Python

김상현·2022년 10월 8일
0

알고리즘

목록 보기
207/301
post-thumbnail

[BOJ] 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번째 줄까지 별을 출력한다.


📍 풀이

💡 고찰

  • 재귀 함수종료 시점과, 재귀하는 방식을 정확하게 구현하지 않으면 원하는 대로 구현되지 않으므로 까다로운 문제라고 생각한다.
  • 문제에서 재귀적인 패턴으로 별을 찍어보자 라는 문구 때문에 재귀를 사용하긴 했지만, 재귀로 구현이 가능한 것들은 대부분 단순 반복문으로도 구현이 가능하기에 평소에는 반복문으로 구현해왔다.
  • 재귀적 함수 코드를 작성한 적이 많지 않아서 이번 코드를 작성하는데 많은 어려움을 겪었다.
  • 어렵다고 피하다보면 정작 필요할 때 더 큰 어려움을 겪는다는 것을 알게되었다.
  • 어렵다고 피하지말고 당면한 문제를 항상 입체적으로 접근하여 다양한 해결방식으로 해결할 수 있도록 해야겠다는 생각을 하였다.

📌 문제 풀이

  • 별(*) 로 구성된 N x N 크기의 배열을 생성한 후 9등분하여 가운데 배열은 공백(' ') 으로 값을 바꾸고, 나머지 배열은 재귀 함수를 통해 다시 처음부터 진행한다.

✍ 코드

from sys import stdin

def solution(N):

    # '*' 로 구성된 N x N 크기의 배열 생성
    arr = [['*'] * N for _ in range(N)]

    # 재귀 함수
    def func(X, Y, N):

        # 현재 패턴의 크기가 3 x 3일 경우
        if N == 1:
            # 가운데 공백 패턴 생성
            arr[Y+1][X+1] = ' '
            return

        # 현재 패턴의 크기가 3 x 3 이상일 경우
        for y in range(3):
            for x in range(3):
                # 9등분된 배열 중 가운데 배열일 경우
                if x == 1 and y == 1:
                    # 가운데 공백 패턴 생성
                    for dy in range(Y + N, Y + 2 * N):
                        for dx in range(X + N, X + 2 * N):
                            arr[dy][dx] = ' '
                # 9등분된 배열 중 가운데 배열이 아닐 경우
                else:
                    # 인자를 변경하여 재귀함수 실행
                    func(X + x * N, Y + y * N, N // 3)
    
    # 재귀함수 실행
    func(0, 0, N//3)

    # 패턴 출력
    for a in arr:
        print(''.join(a))

N = int(stdin.readline())
solution(N)
profile
목적 있는 글쓰기

0개의 댓글