기록하는삶
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2448번 _ 별 찍기 - 11 본문
백준(Python)/재귀(recursion)
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2448번 _ 별 찍기 - 11
mingchin 2022. 2. 6. 23:18728x90
반응형
https://www.acmicpc.net/problem/2448
[문제]
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
[입력]
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
[출력]
첫째 줄부터 N번째 줄까지 별을 출력한다.
[아이디어]
1) 같은 모양을 반복해서 그리되, 가운데 정렬을 구현해야한다.
2) n번째 모양을 기준으로 (n+1)번째 모양을 만들기 위해서는 n번째 모양 3개를 2줄에 걸쳐 이어 붙이면 된다. 첫번째 도형은 아래줄과의 가운데 정렬을 맞추어 하나를 놓고, 두번째 도형은 빈칸 하나를 두고 2개를 더하여 붙이면 된다.
3) (n+1)번째 밑변의 길이는 (n번째 밑변의 길이)*2 + 1 이 되므로, 2)의 첫번째 도형을n만큼 평행이동 하면 가운데 정렬이 된다.
# 별찍기 11
n = int(input())
d= {3:[' * ',' * * ','*****']}
def answer(n):
if n ==3:
return d[3]
else:
if n not in d:
a = answer(n//2)
d[n] = [' '*(n//2)+x+' '*(n//2) for x in a] + [x+' '+x for x in a]
return d[n]
print(*answer(n), sep = '\n')
메모이제이션을 이용했다. 다른 풀이를 보다보니, 우측 정렬과 string.center()라는 내장함수를 이용한 풀이도 있었다.
N=int(input())
r=['*','* *','*'*5]
i=6
while i<=N:
r+=[s + s.rjust(i) for s in r]
i*=2
for s in r:
print(s.center(i))
우측 정렬로 필요한 *들만 모은 뒤, center() 함수로 길이 i에 대한 가운데 정렬을 구현하며 인쇄하는 코드다.
728x90
반응형
'백준(Python) > 재귀(recursion)' 카테고리의 다른 글
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2447번 _ 별 찍기 - 10 (0) | 2022.02.06 |
---|---|
[코딩 테스트 연습(파이썬/Python)] 백준 17478번 _ 재귀함수가 뭔가요? (0) | 2021.11.19 |
[코딩 테스트 연습(파이썬/Python)] 백준 11729번 _ 하노이 탑 이동 순서 (0) | 2021.11.19 |