반응형

1. 문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

2. 입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

1

 

2

 

3

 

4

 

3. 출력

첫째 줄부터 차례대로 별을 출력한다.

*

 

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

 

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

 

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

 

4. 코드

import sys

n = int(sys.stdin.readline())
len = n + (3*(n-1))
# 빈값으로 배열 생성
stars = [[' ' for _ in range(len)] for _ in range(len)]

def checkStar(n,x,y):

  # 정가운데 별찍기
  if n == 1:
    stars[x][y] = '*'
    return
  # 별 사각형 최대길이
  len = n + (3*(n-1))

  for i in range(len):
    # 좌측
    stars[x+i][y] = '*'
    # 상단
    stars[x][y+i] = '*'
    # 하단
    stars[x+len-1][y+i] = '*'
    # 우측
    stars[x+i][y+len-1] = '*'
  
  # 사각형내 사각형 별 찍기 호출
  checkStar(n-1,x+2,y+2)  

checkStar(n,0,0)

for r in stars:
  # 배열을 하나씩 합쳐서 문자열로 만든다.
  print(''.join(r))

 

5. 풀이설명

① 입력 받은 값 × 4 -3 을 별찍기의 최대 길이로 정한다.

 

② ①에서 구한 최대 길이의 빈값으로 이루어진 배열을 생성한다.

 

①에서 구한 최대 길이 len,0,0을 인수로 checkStar 메소드를 호출한다.

 

④ n=len, x=0, y=0을 매개변수로 받고 ①의 최대길이를 다시 구한다.

 

⑤ (x+0,y) ~ (x+len-1,y) / (x,y+0) ~ (x,y+len-1) / (x+len-1,y) ~ (x+len-1,y+len-1) / (x,y+len-1) ~ (x,y+len-1) 상하좌우에 별을 찍는다.

 

checkStar 메소드에 len -2, x+2, y+2를 인수로 재호출한다.(재귀함수)

 

⑦ n이 1일 경우 x.y 좌표(정중앙) 별을 찍고 return 한다.

 

⑧ join 함수를 통해 배열을 한 문자열로 출력한다.

 

6. 느낀점

재귀함수 호출로 구현하는 것이 핵심인데 join 함수를 통해 배열을 문자열로 쉽게 출력하는 법을 배웠다.

반응형

+ Recent posts