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
반응형
'알고리즘 > 백준[baekjoon]' 카테고리의 다른 글
[baekjoon] 1181번 : 단어 정렬 by python (0) | 2022.03.07 |
---|---|
[baekjoon]11651번 : 좌표 정렬하기2 by python (0) | 2022.03.07 |
[baekjoon] 1436 : 영화감독 숌 by python (0) | 2022.03.05 |
[baekjoon] 1018번 : 체스판 다시 칠하기 by pyhton (0) | 2022.03.01 |
[BaekJoon] 2108번: 통계학 by python (0) | 2022.02.28 |