https://www.acmicpc.net/problem/10994
아래 그림처럼,
2일때 맨 첫줄은 별이 5개
3일때는 첫줄 별이 9개 임을 알 수 있다.
n일때는 첫 줄 별이 4n-3 개 이다.
그리고, 3에서 맨 바깥쪽 테투리 별들을 빼면, 그 결과가 2를 입력했을때의 결과랑 완전히 동일하다는 것을 확인할 수 있다.
이 부분을 재귀로 구현하면 된다.
즉, 재귀함수에서
1) 맨 바깥쪽 별 그려주기
2) 그보다 y+2, x+2인 위치부터 그 전 별 그린 것들 똑같이 출력 (재귀)
def rcr(n, y, x): #입력값, 시작점y, 시작점x
M1 = 4*n-3 #가로, 세로 길이
if n <= 0: #0보다 작아지면 출력되는 별이 없으니까 return
return
# 2차원 배열 돌면서 맨 바깥만 별 찍기
for i in range(y, y+M1):
for j in range(x, x+M1):
if i == y or j == x or i== M1+y-1 or j == M1+x-1:
arr[i][j] = '*'
#재귀
rcr(n-1, y+2, x+2)
M1은 1행(파이썬에서는 0행)에 그려지는 *의 개수이다.
2차원 배열을 돌때, y, x가 시작점, 그리고 M1이 길이이니까
range(y, y+M1)으로 설정해주면 원하는 길이만큼 for문을 돌 수 있다.
전체 풀이)
N = int(input())
#1일때 1
#2일때 5
#3일때 9
#4일때 13
arr = [[' ']*(4*N-3) for _ in range(4*N-3)]
M = 4 * N - 3
def rcr(n, y, x):
M1 = 4*n-3
if n <= 0:
return
for i in range(y, y+M1):
for j in range(x, x+M1):
if i == y or j == x or i== M1+y-1 or j == M1+x-1:
arr[i][j] = '*'
rcr(n-1, y+2, x+2)
rcr(N, 0, 0)
for i in range(M):
for j in range(M):
print(arr[i][j], end= '')
print()
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] 백준 17478 재귀함수가 뭔가요? (0) | 2022.10.24 |
---|---|
[파이썬] 백준 1316 그룹 단어 체커 (1) | 2022.10.19 |
[파이썬] SWEA 12712 파리퇴치3 (for 문으로 풀기) (0) | 2022.10.18 |
[파이썬] SWEA 12712 파리퇴치3 (while 문으로 풀기) (0) | 2022.10.18 |
[파이썬] SWEA 2001 파리 퇴치 (0) | 2022.10.18 |