본문으로 바로가기

[백준] 2447번 [재귀함수] 별 찍기 - 10

category 알고리즘/백준 2021. 12. 15. 02:06

📌 [백준 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=3^k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

 27

예제 출력 1

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

나의 풀이

n = int(input())
stars = [[" " for _ in range(n)] for _ in range(n)]

def star_print(size,x,y):
    if size == 1:
        stars[x][y] = '*'
        return
    size = size // 3
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1: continue
            star_print(size,x+i*size,y+j*size)

star_print(n,0,0)

for s in stars:
    print(''.join(s))

 

재귀 함수의 인자로 한 칸의 크기, x좌표, y좌표를 받는다. N×N의 격자를 채우기 위해 N/3×N/3 → N/9×N/9 → ... → 9×9 → 3×3 → 1×1의 격자를 채운다. 따라서 재귀 함수의 탈출 조건을 사이즈로 1을 받아오는 경우로 정한다. 사이즈로 1이 들어오면 해당 좌표를 별로 채우고 사이즈가 1이 아니면 8칸의 서로 다른 좌측 상단 좌표와 1/3한 사이즈의 함수를 재귀 호출해 준다.

 

다른 사람의 풀이

num = int(input())

def star(n):
    if n == 1: return ['*'] 

    stars = star(n//3) 
    L = [] # 별을 출력할 리스트

    for s in stars: L.append(s*3) # 상 구간
    for s in stars: L.append(s+' '*(n//3)+s) # 중 구간
    for s in stars: L.append(s*3) # 하 구간

    return L

print('\n'.join(star(num)))

 

구간을 상중하로 나누어 재귀함수를 통해 구해진 별을 붙여 나감.

 

반응형