[알고리즘 스터디 - 1주차 5] 별 찍기 - 18

난이도

Gold 4

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 10)이 주어진다.

출력

첫째 줄부터 차례대로 별을 출력한다.

예제 입력

3

예제 출력

      *
     * *
    *   *
   *******
  *  ***  *
 *    *    *
*************

해설 및 후기

오랜만에 재귀를 이용한 별찍기를 이용해 문제를 풀이했다. n-1번째에 해당하는 별 모양을 리스트로 받고, 뒤집힌 모양을 기준으로 새로운 별찍기 모양을 생성해 리스트로 반환한다. 그리고 앞쪽 공백을 최종 print때 처리한다(앞쪽 공백은 재귀되지 않으므로)

제출 코드

def hoshi(num):
    if(num==1):
        return ['*']
    else:
        toret = []
        bef = hoshi(num-1)
        if(bef[0] == '*'): #편의를 위해 원하는 모양으로 항상 뒤집기
            bef = list(reversed(bef))
        befLen = len(bef)
        toret.append('*')
        for i in range(befLen-1):
            tmp = '*'
            tmp += ' '*(1 + 2*i)
            tmp += '*'
            toret.append(tmp)
        toret.append('*'+bef[0]+'*')
        for i in range(1, befLen):
            tmp = '*'
            tmp += ' '*2*i
            tmp += bef[i]
            tmp += ' '*2*i
            tmp += '*'
            toret.append(tmp)
        toret.append(bef[0]*2+'*'*3)
        if(num%2 == 0):
            toret = list(reversed(toret))
        return toret

n = int(input())
r = hoshi(n)
for i in range(len(r)):
    if(n%2 == 0):
        print(' '*i, end='')
    else:
        print(' '*(len(r)-i-1), end='')
    print(r[i])