[BOJ/백준] 2477번 별 찍기 - 10

문제

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.

입/출력


풀이

def check(n):
  # x,y = (1,4,7) : 3으로 나눈 나머지가 1
  # x,y = (3,4,5) : 3으로 나눈 몫이 1
  arr = []
  for i in range(3*len(n)): # 빈칸을 만드는 조건문
    if i //len(n) == 1:
      arr.append(n[i % len(n)] + " " * len(n)+ n[i % len(n)])
    else:
      arr.append(n[i % len(n)] * 3)
  return (list(arr))

star =["***","* *","***"]
n = int(input())
k = 0

while n != 3:
  n = int(n/3)
  k += 1

for i in range(k):
  star = check(star)
for j in star:
  print(j)

결과


느낀 점

이 문제는 규칙을 찾아야 풀 수 있는 문제이다. 규칙을 자세히 살펴보면 프렉탈구조라는 것을 알 수 있는데 나는 몰랐다. 프렉탈 구조라는 걸 들어본 적은 있었지만 이렇게 반복적인 규칙을 나타는게 프렉탈 구조라는 것을 처음 알게 되었다. 

프렉탈 구조라는 것을 모르고 문제에 접근하니 당연히 풀이 코드를 작성하기도 힘들었다. 다른 분들의 풀이 법을 보니 구조에서의 특징을 찾고 3으로 나눈 몫이 1인 것과 나머지가 1인 것을 찾아서 빈칸을 넣어주는 것으로 풀었다. 

이 문제는 내가 풀었다기보다는 다른 분들의 코드를 보고서 푼것이라 시간을 두고서 계속해서 풀어보고 이해해서 내 코드로 만들어 봐야겠다.

<