백준 2447번: 별 찍기 - 10 python

tomkitcount·2025년 4월 28일

매일 알고리즘

목록 보기
40/301


문제 요약

N 을 받는다. 이 때 N은 3의 거듭제곱 꼴이다. 즉 3,9,27,81... 3^8 까지.

별을 찍을건데

  • N이 3이라면
***
* *
***

3x3의 꼴로 찍을건데 가운데를 비울것이다.

  • N이 3^2=9 라면
*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********

꼴로 가운데를 비우고, N이 3일때의 꼴로 그 가운데를 둘러싼다.
재귀적으로 이 꼴을 만들어보자.


어떻게 풀까

재귀적으로 반복하자.
어떻게? 뭘?
정사각형 가운데를 파내고
파낸 정사각형의 한변의 별의 개수가 1이 아니라면 3등분해서 가로 세로 3등분해서,3등분된 영역의 가운데를 또 파기.
파낸 정사각형의 한 변의 개수가 1이 아니라면 또 3등분해서
3등분의 영역의 가운데를 파기.
한변의 개수가 1이 될때까지 반복


ㅁㅁㅁ
ㅁㅁㅁ
ㅁㅁㅁ
에서 가운데 ㅁ만 파는 알고리즘을
나머지 ㅁ 8개에서 재귀적으로 호출하기.

내 해답

import sys

N = int(sys.stdin.readline())

# 별판을 2차원 리스트로 만든다
stars = [['*' for _ in range(N)] for _ in range(N)]

def pop_out(x, y, size):
    if size == 1:
        return

    new_size = size // 3

    # 영역을 3*3 으로 9등분 한다.
    for i in range(3):
        for j in range(3):
            nx = x + i * new_size
            ny = y + j * new_size

            if i == 1 and j == 1:
                # 정사각형의 가운데 영역을 공백으로 채우기.
                for a in range(nx, nx + new_size):
                    for b in range(ny, ny + new_size):
                        stars[a][b] = ' '
            else:
                # 나머지 8개는 재귀 호출
                pop_out(nx, ny, new_size)

# 실행
pop_out(0, 0, N)

# 출력
for line in stars:
    print(''.join(line))
profile
To make it count

0개의 댓글