파이썬 알고리즘

[파이썬] 백준 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()