파이썬 알고리즘
[파이썬] 백준 10944 별 찍기 -19
뜻 지, 깨달음 오
2022. 10. 19. 05:02
https://www.acmicpc.net/problem/10994
10994번: 별 찍기 - 19
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
www.acmicpc.net
아래 그림처럼,
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()