알고리즘
[알고리즘/파이썬] 백준 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))