본문 바로가기

Baekjoon

[Baekjoon]백준 2447 별 찍기 - 10(골드 5) - Python

문제설명
예제

문제를 살펴보면 별을 그리되, 재귀함수를 사용하여 그려야한다

규칙 자체는 이해하는데 어렵지 않다 중앙만 비우면 되기 때문이다

그래서 예제에서 27을 입력하면 한 줄에 최대 27개의 별이 그려지고 정사각형 모양이 규칙적으로 등장한다

큰 정사각형으로 보아도, 작은 정사각형으로 보아도 중앙은 공백으로 채워져있다

 

재귀함수를 사용해서 하려고 하니 꽤나 오랜시간 고민을 하였는데,

작은 정사각형 하나를 기준으로 잡고 코드를 작성하였다

def draw_star(n):
    if n == 3:
        return ['***', '* *', '***']
    star = draw_star(n//3)
    result = []
    
    for st in star:
        result.append(st * 3)
    for st in star:
        result.append(st + ' ' * (n//3) + st)
    for st in star:
        result.append(st * 3)
    
    return result

N = int(input())
print('\n'.join(draw_star(N)))

함수에 3이 입력되면 작은 정사각형을 return한다

입력값이 3보다 크다면 재귀적으로 n을 3으로 나눈 별 모양을 만들어주게 된다

그렇게 되면 star에는 n//3, n//3 크기의 별 모양이 저장이 되는데 이렇게 만든 별 모양을 3번의 for문을 통해 결합해준다

마지막에 결합한 별 모양을 return 해주면 되는데, 해당 별 모양은 리스트 모양으로 저장되기 때문에

join함수를 통하여 줄바꿈과 동시에 결과값을 출력하도록 작성하면 된다

 

↓ 리스트로 저장된 경우의 반환된 값(draw_star(9))↓

[
    '*********',
    '* ** ** *',
    '*********',
    '***   ***',
    '* *   * *',
    '***   ***',
    '*********',
    '* ** ** *',
    '*********'
]