Beakjun_Solve/재귀함수

#백준 [#2447_별 찍기 - 10], [#2448_별 찍기 - 11], #재귀함수

CodingStriker 2024. 3. 3. 02:31
반응형

문제 : https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

문제

재귀적인 패턴으로 별을 찍어 보자. 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 복사

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

풀이

def recursive(y, x, n):
    if n == 3:
        for i in range(-1, 2):
            data[y][x+i] ="*"
        data[y+1][x-1] = data[y+1][x+1] = "*"
        for i in range(-1, 2):
            data[y+2][x+i] ="*"
   
    else:
        nextN = n // 3
        for i in range(-2, 1):
            recursive(y, x + i * nextN, nextN)
        recursive(y+ nextN , x - 2*nextN, nextN)
        recursive(y + nextN, x, nextN)
        for i in range(-2, 1):
            recursive(y+ 2*nextN, x + i * nextN, nextN)
       

N = int(input())
data = [[" "] * N for _ in range(N)]

recursive(0, N-2, N)
for i in data:
    print("".join(i))

 

문제 : https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1 복사

24

예제 출력 1 복사

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

 

풀이 :

n = int(input())
data = [[" "] * 2 * n for _ in range(n)]

def recursive(y, x, n):
    if n == 3:
        data[y][x] = "*"
        data[y+1][x-1] = data[y+1][x+1] = "*"
        for i in range(-2,3):
            data[y+2][x+i] = "*"
   
    else:
        NextN = n // 2
        recursive(y, x, NextN)
        recursive(y + NextN, x - NextN, NextN)
        recursive(y + NextN, x + NextN, NextN)

recursive(0, n-1, n)

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

 

각 단계에서의 시작점과 사이즈에 따라 변하는 좌표 값들의 관계를 잘 이해하면 쉽게 재귀함수로 풀 수 있다.

반응형