블로그 이름 뭐로 하지

[알고리즘/파이썬] 백준 2248 - 별 찍기 11 본문

알고리즘

[알고리즘/파이썬] 백준 2248 - 별 찍기 11

발등이 따뜻한 사람 2024. 1. 14. 17:43

문제

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=3일때 만들었던 삼각형이 n=6일때 양쪽에 추가되고, n=6일때 만들었던 트리가 n=12일때 양쪽에 추가되는 식으로 발전한다는 것이다.

사실 거기까진 오케이였는데 양쪽에 공백을 넣는걸 어떻게 넣어야하나..ㅠㅠ 이 부분에서 해결이 안 됐다.

다른 분 풀이를 보니 우선 n=3일때 맨밑은 5칸, n=6일때 맨밑이 11칸이니까 우선 2*N-1 만큼 크기로 공백 그래프를 만든 후 별찍기를 추가해주는 방식으로 해줬더라..!

참 어렵다 ㅠ

 

 

코드

n = int(input())

graph = [[" ", " ", "*", " ", " "], [" ", "*", " ", "*", " "], ["*", "*", "*", "*", "*"]]


def recursive(N, before):
    after = [[" "] * (2 * 2 * N - 1) for _ in range(2 * N)]
    for i in range(N):
        after[i][N:N+2*N-1] = before[i]

    k = 0
    for i in range(N, 2 * N):
    	# after[i][:2*N] 의 길이가 before[k]보다 1만큼 크기 때문에 가운데에 공백이 자연스레 생긴다.
        after[i][:2*N] = before[k]
        after[i][2 * N:2 * N+len(before[k])] = before[k]
        k += 1

    if 2 * N == n:
        return after

    return recursive(2 * N, after)


if n == 3:
    result = graph
else:
    result = recursive(3, graph)

for i in result:
    print("".join(i))