본문 바로가기

백준 문제 풀이

[백준] 10997 "별찍기 - 22" 재귀 -python

알고리즘

 재귀호출을 통해 별을 찍는다. 가로 4n-3, 세로4n-1인 2차원 배열을 생성한 뒤 함수를 통해 찍어준다. 주의 할 점은 base conditon은 N=1일때 이고 각 호출마다 함수가 실행하고 넘길 모양은 첫행, 첫열, 마지막행, 마지막 열(y축이 1인경우 제외) 하고 가운데 r자 모양이다.

소스코드

# 별 찍기 - 22
n = int(input())
stars = [[" " for i in range(4*n-3)] for j in range(4*n -1)] #배열초기화
def fill(N, x, y):
    if N == 1: #기저 조건
        stars[x][y] = "*"
        return
    
    l1 = 4*N-1
    l2 = 4*N-3
    
    #열찍기
    for i in range(l1):
        stars[x+i][y] = "*"
        if i != 1:
            stars[x+i][y+l2-1] = "*"

    # 행찍기
    for i in range(l2):
        stars[x][y+i] = "*"
        stars[x+l1-1][y+i] = "*"
    
    # 가운데 r자 찍기
    stars[x+l1//2][y+l2//2] = "*" 
    stars[x+l1//2+1][y+l2//2] = "*"
    stars[x+2][y+l2-2] = "*"
       
    fill(N-1, x+2, y+2)

fill(n, 0, 0)
if n == 1: #예외처리
    print("*")
else: # 2번째 줄 공백 무시해야함 (백준 출력형식에서 드래그 해볼것)
    l = len(stars)
    for s in range(l):
        if s==1:
            print("*")
        else:
            print(''.join(stars[s]))

 

느낀점

 계속 출력형식이 맞지 않는다고 해서 n을 50까지 키웠었다. 하지만, 백준에서는 2번째 줄에 공백이 없는 것을 깨닫고 바로 정답이 되었다. 이런 함정도 있구나...