문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
코드
n = int(input())
star = ["***","* *","***"]
def make_stars(x):
matrix=[]
for i in range(3 * len(x)):
if i // len(x) == 1:
matrix.append(x[i % len(x)] + " " * len(x) + x[i % len(x)])
else:
matrix.append(x[i % len(x)] * 3)
return(list(matrix))
k = 0
while n != 3:
n = int(n / 3)
k += 1
for i in range(k):
star = make_stars(star)
for i in star:
print(i)
Divide and conquer 문제입니다.
가장 작은 별인
***
* *
*** 가 반복되므로 이를 담는 리스트를 만듭니다.
별이 3개 일때는 그대로 출력하고 2개일때는 가운데 칸을 제외하고 출력합니다.
반복하는 여기서 k는 (입력받은 n의 지수) - 1 입니다.
18, 19번째 줄에서 k번 만큼 반복합니다.
n = 27일 때, 처음에는 n = 9일 때를 먼저 star에 저장하고 다시 반복하여 n = 27일 때의 패턴을 star에 저장, 출력합니다. (재귀를 이용하듯이) 4번째 줄은 가운데에 빈 공간을 만들기 위한 조건문입니다.
'⏰ 코딩테스트 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 - 1991 - 트리 순회 (0) | 2021.01.29 |
---|---|
백준 알고리즘 - 9095 - 1, 2, 3 더하기 (0) | 2021.01.25 |
백준 알고리즘 - 2630 - 색종이 만들기 (0) | 2021.01.11 |
백준 알고리즘 - 10871 - X보다 작은 수 (0) | 2020.07.22 |
백준 알고리즘 - 10039 - 평균 점수 (0) | 2020.07.22 |