코드연습/BOJ

BOJ 2447 : 별 찍기 - 10[python3]

AI 로밧 2022. 4. 18. 16:39
728x90

문제

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

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

***
* *
***

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

풀이

도저히 모르겠어서, 다른 사람 아이디어를 참고하고 풀었다. https://cotak.tistory.com/38

 

[백준] 2447 - 별 찍기 - 10 [Python(파이썬)]

문제 www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에..

cotak.tistory.com

1. 여기서 배운 건 재귀는 항상 수렴 조건이 필요하다.
    - if condition --> return False or True

2. 그 수렴 조건 까지 반복할 수 있어야 한다.
    - if condition --> return Func(condition)

 

참고한 코드는 결국 수렴 조건에서 별 1개를 뱉어내는 리스트를 만들고, 하나의 별모양 블럭을 출력하지만 중간에 빈 구역을 출력하기 위해서 나머지 추가 조건을 주고, 아래와 같은 배열 수렴 조건의 배열을 뱉어낸다.

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

그리고 이것을 리스트 분자들 간 join구문을 이용해서 붙여서 활용한다.

 

또 중요한 재귀 문제를 푸는 것에서 재귀의 깊이를 결정하는 부분인데,

sys.setrecursionlimit(깊이)를 지정해주어야 시간 초과를 받지 않는다.(runtime error)

import sys
sys.setrecursionlimit(10**6) # 재귀 호출 깊이를 늘리는 방법

def stars(N):
    if N == 1:
        return ['*']

    star = stars(N//3)    
    L = []
    
    for s in star:
        L.append(s*3)
    for s in star:
        L.append(s+' '*(N//3)+s)
    for s in star:
        L.append(s*3)
    return L

if __name__ == '__main__':
    N = int(input())

    print('\n'.join(stars((N))))