For Programmer

백준 2447번 파이썬 문제풀이(재귀 - 별 찍기 - 10) 본문

코팅테스트/백준 문제 모음

백준 2447번 파이썬 문제풀이(재귀 - 별 찍기 - 10)

유지광이 2021. 10. 5. 15:19
728x90

 

코드

def get_stars(n):
    matrix = [] #별을 담을 리스트 선언
    for i in range(len(n) * 3): #인자로 전달된 리스트의 길이 * 3만큼 반복(별의 총 줄 개수가 3배씩 늘어나기 때문 ex)3 -> 9 -> 27 ...)
        if i // len(n) == 1: #인자로 전달된 리스트의 길이로 나눈 몫이 1일 경우(즉,별모양에서 중간에 빈칸이 들어가는 경우의 범위)
            matrix.append(n[i % len(n)] + " " * len(n) + n[i % len(n)]) #해당 빈칸의 개수만큼(인자로전달된 리스트의 길이가 빈칸의 개수)별 중간에 추가해준다.
        else:#그 외 경우
            matrix.append(n[i % len(n)] * 3) #리스트에 저장되어있는 별의 개수 * 3배 만큼 추가해준다.(각 줄마다 별의 개수가 3배만큼 증가하기 때문)
    return matrix #별이 저장되어 있는 리스트를 반환


resultStar = ["***", "* *", "***"] # n==3일 때의 별 초기화

n = int(input())
count = 0 #별의 개수를 구하는 함수(get_stars) 반복횟수 구하기

while n != 3: #n이 3이아닐때 반복(3이면 그냥 바로 출력)
    n //= 3 #n을 3으로 나눈 몫을 대입
    count += 1 #한번 나눌때 마다 count값 1씩 증가

for _ in range(count): #count값 만큼 반복(n이 9이상일 때)
    resultStar = get_stars(resultStar) #반복할 때마다 별의 개수가 줄마다 3배씩 늘어나기 때문에 늘어난 별의 개수를 그 전 개수 별의 리스트에 대입해준다.

for j in resultStar: #리스트에 저장되어있는 별을 줄마다 출력
    print(j)

-> 굉장히 까다로운 문제이다. 평소에도 재귀를 잘 못하는 편이기 때문에 코드를 짜는것 자체부터가 어려웠는데 조건을 알아도 그것을 코드로 옮기는 것이 너무나도 어려운 문제였다. 구글에 돌아다니는 정답코드를 참고하였으며 코드를 적고도 분석하는데 오랜 시간이 걸렸다.  이문제의 핵심은 빈칸에 들어가는 공백의 개수와 공백이 어느 범위에서 들어가는지(위의 코드에서 if i // len(n) == 1) 이부분을 찾는 것이다. 

728x90
Comments