BAEKJOON-2447 : 별찍기-10

최대 1 분 소요

BEAKJOON-1011 : 별찍기-10

문제 사진

오랜만에 별찍기 문제를 푼다. 거의 .. 4년만..?

이 문제는 재귀마다 공간을 가로, 세로로 3칸씩 나누면 된다.

그래서 입력도 3의 지수가 입력된다. 즉 어떤 입력된 값이라도 3칸으로 나눌 수 있다는 소리.

문제에서 길이가 3일때의 패턴을 알려줬으므로

재귀를 길이가 3일때까지 나누고, 중앙은 공백으로 채우면된다.

종료조건으로 길이가 3일때 패턴을 출력해주면 된다.

코드

def starfilled(arr, n, y):
    if n == 3:
        arr[y]   += '***'
        arr[y+1] += '* *'
        arr[y+2] += '***'
        return
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                for k in range(y+n//3, y+n//3+n//3):
                    arr[k] += ' '*(n//3)
            else:
                starfilled(arr, n//3, y+(n//3)*i)

n = int(input())
arr = ['' for _ in range(n)]
starfilled(arr, n, 0)
for i in range(n):
    print(arr[i])

사실 위 코드에서 중복되는 경우가 있다.

n이 3일때 조건에서 보면 arr[y+1] += ‘* *‘처럼 중앙에 공백을 넣는데,

밑의 중첩 반복분(for k in range()) 에서도 중앙 공백을 넣어주는 부분이 겹친다. (실제로 값을 중복으로 넣는 것은 아님)

따라서 아래와 같이 if n==1: 로 바꿔주면 코드가 깔끔하지만,

이 코드는 길이가 1일때까지 재귀가 돌아서 위 코드보다 3배의 실행시간이 차이난다.

if n == 1:
        arr[y] += '*'
        return

오랜만에 별찍기 코딩을 해서 재밌었다😁

카테고리:

업데이트:

댓글남기기