파게로그

[백준 2448번] 별 찍기 - 11 본문

콤퓨타 왕왕기초/PS

[백준 2448번] 별 찍기 - 11

파게 2020. 11. 13. 14:20

문제 링크: 2448번 별 찍기 - 11

https://www.acmicpc.net/problem/2448

 

머릿속에서 프랙탈을 그려나가는 것과, 실제로 코드를 이용해서 출력하는 것과의 차이는

아마 쪼갤 때 공백을 어떻게 포함하느냐의 문제가 핵심인 듯하다.

삼각형은 단순히 '가운데 정렬'로 보이지만 앞에 그 만큼의 공백이 앞에 있어야 한다든가...

 

그런데 여기서 삼각형에 접하는 사각형만큼을 하나의 덩어리로 볼 것인지

또는 그 앞의 공백을 모두 포함하는지부터 생각을 하는 편이 좋다.

 

결론은, star(n)이 호출하는 star(prev)가 return하는 배열이 삼각형에 접하는 사각형만큼만 딱 그려내주고,

그 앞의 공백들은 어차피 점차 길이가 감소하는 반쪽짜리 삼각형이기에 맨 마지막에 삽입해줄 수 있다.

 

이걸 조금 헤매다가 발견했는데...

결론적으로는, star()과 draw_star()을 분리한 것이 해답이 된 듯하다.

 

def star(n):
    if n==3:
        arr = [['*'],['*', ' ', '*'], ['*', '*', '*', '*', '*']]
        return arr

    # 1번 삼각형 만들기
    arr = star(n//2)

    # 2번 삼각형 만들기 (1번에서 복사)
    lenArr = len(arr)
    for i in range(lenArr):
        newArr = []
        for j in arr[i]:
            newArr.append(j)
        arr.append(newArr)
    
    # 빈 삼각형 넣어주기
    space = n - 1
    for i in range(n//2, n):
        for j in range(space):
            arr[i].append(' ')
        space -= 2
    
    # 3번 삼각형 넣어주기 (1번에서 복사)
    copyFrom = 0
    for i in range(n//2, n):
        for item in arr[copyFrom]:
            arr[i].append(item)
        copyFrom += 1
    
    return arr

def draw_star(n): # 앞쪽에 여백 넣어주고 배열을 문자열로 출력
    starMap = star(n)
    space = n - 1
    for i in range(len(starMap)):
        for j in range(space):
            print(' ', end='')
        space -= 1
        print(''.join(starMap[i]))

n = int(input())
draw_star(n)
Comments