본문 바로가기
알고리즘

[백준 2447번] 별 찍기 - 10 in python

by lucian 2021. 10. 28.

문제

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

 

예제 입력 1 

27

예제 출력 1

***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

 

 

 

 


2시간동안 고민했지만 결국은 풀 수 없었다.ㅜ

결국 다른 사람들이 푼 것을 봤고, 그 중 젤 이해하기 쉬운 것으로 풀었다.

 

https://cotak.tistory.com/38 

 

[백준] 2447 - 별 찍기 - 10 [Python(파이썬)]

문제 www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에..

cotak.tistory.com

이분의 풀이 중 2번째 방법을 이해하고 코드를 짜봤다.

def draw_stars(n):
  if n==1:
    return ['*']

  Stars=draw_stars(n//3)
  L=[]

  for star in Stars:
    L.append(star*3)
  for star in Stars:
    L.append(star+' '*(n//3)+star)
  for star in Stars:
    L.append(star*3)

  return L

N=int(input())
print('\n'.join(draw_stars(N)))

 

제일 먼저 재귀적인 방법으로 n을 1까지 도달하게 한다음 ['*']을 리턴해준다.

그러면 n=3일 때의 draw_starts(1)이 되므로 Starts는 ['*']이 되고 그 밑의 for문을 실행하게 된다.

총 3개의 for문을 ['*']로 돌렸을 때

L의 결과는 ['***', '* *', '***'] 이 된다.

 

처음에 손으로 하나씩 풀어봤을 때, 이해가 되지 않았다. 그 이유는 내가 *을 L 리스트의 요소 하나로 인식했기 때문이다.

실제로 '***'이 하나의 요소인데 '*','*',*' 이런식으로 이해해가지고 답을 풀어낼 수 없었다.

 

'***'을 하나의 요소로 이해하니 금방 해결됬다.

n=3일 때의 함수는 끝이나고 n=9일 때 넘어가니

첫번째 for문 결과

['*********',

 '* ** ** *',

 '*********']

이 되었다. n=9일때의첫번째 줄이 완성된 것이다.

두번쨰 for문 결과

['***   ***',

 '* *   * *',

 '***   ***'] 이 L에 추가로 들어갔다. 

마지막 세번째는 첫번째 for문과 같으므로

 

최종 결과는

['*********',

 '* ** ** *',

 '*********',

 '***   ***',

 '* *   * *',

 '***   ***',

 '*********',

 '* ** ** *',

 '*********']

 

이 된다.

 

이런 순환이 재귀가 끝날 때까지 반복되고,

 

마지막 '\n'.join()함수를 써서 리스트의 요소를 붙이는데 요소를 붙일 때 \n(줄바꿈)을 써서 붙여주면 원하는 결과의 답이 나오게 된다.

 

 

 

댓글