백준 - 별 찍기 - 10(2447)

유재우·2022년 5월 14일
0

IFP-껐다 켜면 됩니다

목록 보기
66/123

문제

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

  • 정답
n = int(input())
def star(l):
    if l == 3:
        return ['***','* *','***']
    arr = star(l//3)
    stars = []
    for i in arr:
        stars.append(i*3)
    for i in arr:
        stars.append(i+' '*(l//3)+i)
    for i in arr:
        stars.append(i*3)
    return stars
print('\n'.join(star(n)))
  • 엄두조차 안나는 별 찍기는 처음이다...
N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태입니다.
따라서 N의 패턴을 알려면 N//3 의 패턴을 알아야 합니다. 결국 재귀를 돌면서 N은 최소단위인 3이 되고, N=3일때의 패턴을 만들고 리턴해줍니다.
3의 패턴을 가지고 9의 패턴을 알게되고, 9의 패턴을 가지고 27의 패턴을 알게되고.. 반복하면서 결국 N의 패턴을 알게 됩니다. 패턴을 만들때 가운데부분은 비워주는걸 유의해야 합니다.

참고한 블로그링크

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글