본문 바로가기

백준 코딩 테스트

백준 - 2447번 별찍기(10)

728x90

출처: 2447번: 별 찍기 - 10 (acmicpc.net)

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net


별 찍기 - 10 성공분류

시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율

1 초 256 MB 27523 14062 10246 50.945%

문제

재귀적인 패턴으로 별을 찍어 보자. 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이다.


[ 문제 설명 ]

 

이 문제의 이해의 첫 단추는 *를 채우고 지우는 방식이 아니라 비운 상태에서 *를 채우는 방식으로 진행한다는 것입니다.

 

그림으로 설명하겠습니다.

 

그림 1 - 별찍기 10 설명


[ 코드 ]

 

def starts(n):
    if n == 3:
        drawing[0][:3] = drawing[2][:3] = [1] * 3
        drawing[1][:3] = [1, 0, 1]
    else:
        t = n // 3
        starts(n // 3)
        for q in range(3):
            for w in range(3):
                if q == 1 and w == 1:
                    continue
                for v in range(t):
                    drawing[t * q + v][t * w: t * (w + 1)] = drawing[v][:t]


n = int(input())
drawing = [[0 for i in range(n)] for i in range(n)]

starts(n)

for i in drawing:
    for j in i:
        if j:
            print('*', end='')
        else:
            print(' ', end='')
    print()

 


후기

 

그림을 잘 이해하시고, 혹은 이해가 애매하다고 하셔도

보신 후에 코드를 보시면 더 빠르게 이해가 되실 겁니다.

728x90