[Python] G5_2447_별 찍기10✨

Sangho Han·2023년 5월 19일
post-thumbnail

https://www.acmicpc.net/problem/2447

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 아래와 같은 패턴이다.

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 아래와 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

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

조건

시간 제한 1초
메모리 제한 256MB

접근

  1. 3x3의 형태로 계속해서 나타나니깐, 나머지는 다 찍어주고 5번째만 비우면 되지 않을까?
  2. 만약에 n=9이면, 3x3을 해서 나온 형태를 저장을 해준 후에, 이걸로 다시 9x9를 만들어주면 될 것 같은데..
  3. 문자열에 더해서 저장하는 식으로 한 번 해보자!

라며 호기롭게 시작했지만.. 문자열에 +로 계속 추가를 하니깐 자꾸 아래에 문자가 이어져서 이 방법은 포기를 했다😥

그래서 결국 서칭을 해서 여러 고수분들의 코드를 참고하여 아래와 같은 코드를 작성하였다.

코드

import sys
input = sys.stdin.readline

def paintingStar(size):
    if size == 1:
        return ['*']
    
    stars = paintingStar(size//3)
    
    L = []
    for s in stars:
        L.append(s*3)
    for s in stars:
        L.append(s + ' '*(size//3) + s)
    for s in stars:
        L.append(s*3)
    return L
    
if __name__ == '__main__':
    n = int(input())
    print('\n'.join(paintingStar(n)))

이 방법은 재귀를 통해서 size를 1까지 만든 후에, 순차적으로 함수를 실행시키는 것이다.

그래서 처음에는 잘 이해가 되지 않았다..

n=9일 때를 예로 들어서 설명해보겠다.

  1. 처음 size는 9이기 때문에, size를 3으로 나눈 후에 다시 함수를 호출한다.

  2. 이번에도 1이 아니기 때문에 다시 size를 3으로 나눈 후에 호출한다.

  3. 이제 size가 1이므로 ['*']를 return해주고, 이는 size가 3인 상태에서의 함수의 stars가 된다.

  4. for문을 통해서 size=3에서의 L은 아래와 같이 된다.

  5. L을 받은 size=9에서 다시 for문을 돌리면 L은 다음과 같이 된다.

    원하는 모양이 잘 나온 것을 볼 수 있다!

  6. join()을 사용해 줄바꿈으로 출력한다.

느낀 점 & 배운 점

  1. 재귀 함수는 가능성이 무궁무진하구나라는 생각이 들었다.
  2. 문제를 크고 복잡하게 보면 어려우니깐, 우선은 가장 작은 케이스부터 따져보고, 이를 큰 케이스에도 적용시키면서 수정해나가자!
profile
안녕하세요. 비즈니스를 이해하는 백엔드 개발자, 한상호입니다.

0개의 댓글