알고리즘/백준[baekjoon]

[baekjoon] 2447 별찍기 -10 by python

코딩하는이씨 2022. 3. 1. 22:28
728x90
반응형

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

code 

#파이썬의 기본 재귀 깊이 제한이 얕아서 재귀사용 풀이시 필수!
import sys
sys.setrecursionlimit(10 ** 6) #재귀의 최대 깊이 1000 >> 10**6

def draw_star(n):
    if n == 1:
        return ['*']

    stars = draw_star(n//3)
    l = []

    for s in stars:
        l.append(s*3)
    for s in stars:
        l.append(s+' '*(n//3)+s)
    for s in stars:
        l.append(s*3)
    return l

n =  int(sys.stdin.readline().strip())
print('\n'.join(draw_star(n)))

 

이번 문제의 팁은 아래의 코드를 사용하여 기존 파이썬의 재귀의 깊이인 1000을 늘려주어

오류를 막아주는 것이다. 

import sys
sys.setrecursionlimit(10 ** 6) #재귀의 최대 깊이 1000 >> 10**6

 

또한 .join 함수를 이용해 '\n'을 구분자로 활용해 줄 바꿈을 해주어야 한다.

 

 

 

 

재귀함수는 '*'에서 시작하여 좌 우로 늘려주는 식으로 구성되었다.

def draw_star(n):
    if n == 1:
        return ['*']

    stars = draw_star(n//3)
    l = []

    for s in stars:
        l.append(s*3)
    for s in stars:
        l.append(s+' '*(n//3)+s)
    for s in stars:
        l.append(s*3)
    return l

 

내부 구동

 

위 재귀 함수를 실행 시키면 n값이 1이 될때 까지 재귀함수를 반복하다,

1이되면 star기본값을 '*'로 저장하고 다시 돌아가며 늘려간다.

 

해당 별을 'ㅣ'리스트에 저장하며

한번 순환하면 아래 형식으로 저장이 되어잇는데 

["***","* *","***"]

이를 또 return하여 0번 인덱스에 *3한값을 append하고 1,2번인덱스도 마찬가지로 실행해준다

그다음은 다시 0번 인덱스인 "***"에

s+' '*(n//3)+s

한 값을 추가하고 1,2번인덱스도 마찬가지로 실행해준다.

 

그다음은 다시 0~2번 인덱스에 *3값도 추가해주면 아래와 같이 완성된다.

 

여기까지 실행되면

'*********'
'* ** ** *'
'*********'
'***   ***'
'***   ***'
'*********'
'* ** ** *'
'*********'

위와 같이 저장되있는걸 확인 할수 있다. 이를 재귀함수 호출 만큼 반복한다면 원하는 별 모양에 다다를수 있다.

728x90
반응형