별 찍기 - 11

solved_ac[Class4] 별 찍기 -11

문제

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

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, …) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

24

예제 출력 1

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

알고리즘 분류

[재귀], [분할 정복]

문제에 대한 접근

스크린샷 2022-05-13 오후 10 45 53

스크린샷 2022-05-13 오후 10 46 02

스크린샷 2022-05-13 오후 10 46 14

재귀의 규칙은 어렵지 않게 찾을 수 있었다. 그러나 “공백을 어떻게 처리할 것인가?”에 대하여 오랜 고민의 시간을 보냈다. 처음에 print로 접근하여서 공백처리하는데 꽤 애를 먹었다. 결국, matrix를 활용하면 공백처리가 가능하겠구나 깨닫고 이를 바탕으로 코드 작성을 하였다.

1트

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

# 초기 조건
n = int(input())
plane = [[" " for _ in range(2*n-1)] for _ in range(n)]

def print_star(x,y,n):
    # Base Case
    if n == 3:
        plane[x][y] = "*"
        plane[x-1][y+1] = "*"
        for i in range(-2,3):
            plane[x+i][y+2] = "*"
    
    else:
        print_star(x,y,n//2)
        print_star(x-n//2,y+n//2,n//2)
        print_star(x+n//2,y+n//2,n//2)

print_star(0,n-1,n)

for i in plane:
    print("".join(i))

처음에 x축 y축을 잘못 잡아서 틀렸다. 수학에서의 그래프에 익숙해서 습관적으로 x,y축을 거꾸로 잡았는데 matrix에서는 행이 우선이므로 그래프를 다음과 같이 잡아야한다.

스크린샷 2022-05-13 오후 10 53 50

또한 Base Case 부분의 코드에서 빠뜨린 부분이 있어 추가하여 2트에 올바른 결과가 나왔다.

2트

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

# 초기 조건
n = int(input())
plane = [[" " for _ in range(2*n-1)] for _ in range(n)]

def print_star(x,y,n):
    # Base Case
    if n == 3:
        plane[x][y] = "*"
        plane[x+1][y-1] = "*"
        plane[x+1][y+1] = "*"
        for i in range(-2,3):
            plane[x+2][y+i] = "*"
    # General Case
    else:
        print_star(x,y,n//2)
        print_star(x+n//2,y-n//2,n//2)
        print_star(x+n//2,y+n//2,n//2)

print_star(0,n-1,n)

for i in plane:
    print("".join(i))

© 2022. All rights reserved.

Powered by Hydejack v9.1.6