기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2448번 _ 별 찍기 - 11 본문

백준(Python)/재귀(recursion)

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2448번 _ 별 찍기 - 11

mingchin 2022. 2. 6. 23:18
728x90
반응형

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은 항상 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
반응형