[BOJ][⚪1][백준#02447] 별 찍기 - 10

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #2447


문제

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.


예제

입력

27


출력

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


My Sol

def foo(ni, nj, nl):
    if nl==3:
        global mat
        for i in range(3):
            for j in range(3):
                if i==1 and j==1: continue
                mat[ni+i][nj+j]='*'
        return

    tl = nl//3
    for i in range(ni, ni+3*tl, tl):
        for j in range(nj, nj+3*tl, tl):
            if i==ni+tl and j==nj+tl: continue
            foo(i, j, tl)
    return


L = int(input())
mat = [[' ']*L for _ in range(L)]

foo(0, 0, L)

for lst in mat:
    print(*lst, sep='')

for문을 이용해 전체를 3x3등분한 뒤, 중앙에 해당하는 인덱스일 때 출력을 넘어가는 방식을 활용한다. 최초 배열을 초기화해주는데, 크기가 최대 3의 7승, 즉 2000을 조금 넘기는 수준이므로, LxL이 최대 40000칸으로 충분히 시간적으로 가능한 방식이라고 생각했다.

길이가 3이 된다면 최소 단위이므로 for문을 이용해 별을 중앙만 빼고 집어넣고 return한다. 이 최소 단위를 또 중앙 주변으로 두르고, 다시 이를 최소단위로 하여 또 두르면서 커진다.


결과

맞았습니다!!


모범답안

출처

def append_star(LEN): 
    if LEN == 1: 
        return ['*'] 
    Stars = append_star(LEN//3) 
    L = [] 
    for S in Stars: 
        L.append(S*3) 
    for S in Stars: 
        L.append(S+' '*(LEN//3)+S) 
    for S in Stars: 
        L.append(S*3) 
    return L 

n = int(input()) 
print('\n'.join(append_star(n)))

실행시간과 코드길이 모두 짧은 코드이다. 너무도 신박하게 문제를 해결하셨다. 처음부터 배열의 크기를 최대로 초기화한 것이 아니라, 최소단위가 된다면 리스트에 [*]을 추가하는 방식이고, 재귀와 for문을 이용해 일차원 같은 다차원 리스트를 만들어주었다.

길이가 3이면 [*]을 단위로, 기본 단위를 만들어 이를 L에 추가하다가 반환하고, 이를 다시 단위로 또 단위를 만드는 방식을 사용하여 배열을 확장하며 풀으셨다.

댓글남기기