본문 바로가기
알고리즘/BOJ

[Python] 백준 2448번: 별 찍기 - 11

by PIAI 2022. 3. 29.

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

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

 

 

문제를 보면 N번째 줄까지 별을 출력하고, N은 항상 3x2^k의 수입니다.

 

N = 6 은 위, 대각왼쪽아래, 대각오른쪽아래가 N = 3 이 반복된 것을 볼수있습니다. 

N = 12 은 위, 대각왼쪽아래, 대각오른쪽아래가 N = 6 이 반복된 것을 볼수있습니다.

 

이렇게 N은, N / 2가 위, 대각왼쪽아래, 대각오른쪽아래로 만들어 진것입니다.

그럼 이 모든 값을 좌표로 저장하기 위해 2차원 배열을 만들고, 세로는 N개만큼, 가로는 2*N - 1만큼 만들어 줍니다.

이제 좌표에서 공식을 도출하면, N = 12 인 경우를 예로 들겠습니다.  맨위 꼭짓점 기준으로 3등분 하겠습니다.

3등분 한 조각들과 좌표들이 나열 됐습니다. 그럼 다시 이 좌표들을 N/2로 쪼개고 N이 3이될때까지 분할해줍니다. N = 3이면 중간이 빈 삼각형을 좌표에 넣어줍니다.

 

공식을 도출하면 위와 같은 식이 나옵니다. 이제 코드 구현 하겠습니다.

M = int(input())
star = [[' ' for _ in range(M*2)] for _ in range(M)]

def go(x, y, n):
    if n <= 3:
        for i in range(3):
            for j in range(i+1):
                star[x+i][y+j] = star[x+i][y-j] = '*'
        star[x+1][y] = ' '
        return
    m = n // 2
    go(x, y, m)
    go(x+m, y-m, m)
    go(x+m, y+m, m)

go(0, M-1, M)

for i in range(M):
    print("".join(star[i]))

댓글