공부하기/백준

[Java] 백준 풀기 2447 - 별 찍기 10

XEV 2023. 7. 8. 23:56

자바 백준 2447번

골드 5

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 분할 정복, 재귀

 

 

 

 

 

문제 풀기

덩어리 패턴을 보면 가운데는 별을 출력하지 않기때문에 이 부분을 빼고 3 by 3 형태에서 9구획으로 나눈 8개 부분만 재귀를 사용한다.

이 나눈 구획은 마지막인 size 1을 제외하고 항상 3의 제곱수를 갖는다. 따라서 매번 재귀 함수에 진입할때마다 3으로 나눈  newSize로 패턴을 형성한다. 8구획 모두 지속적으로 적용하는 방법으로 패턴을 그린다.

 

 

 

 

 

코드 보기

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        printPattern(N);
    }

    public static void printPattern(int N) {
        // 패턴을 담을 Array 생성
        char[][] pattern = new char[N][N];
        // Array에 공백으로 모두 채워 초기화
        for (char[] row : pattern) {
            Arrays.fill(row, ' ');
        }
        
        // 패턴 메서드 실생
        drawPattern(pattern, 0, 0, N);
        
        // pattern 저장된 Array 출력
        for (char[] row : pattern) {
            System.out.println(row);
        }
    }

	// 패턴을 그리는 재귀적 메서드
    public static void drawPattern(char[][] pattern, int row, int col, int size) {
        if (size == 1) {
        	// base case
            // 재귀의 마지막단인 size가 1이면 "*"로 채움
            pattern[row][col] = '*';
        } else {
        	// recursive case
            // 재귀적으로 패턴 지정
            int newSize = size / 3;
            
            // 왼쪽 상단
            drawPattern(pattern, row, col, newSize);
            // 가운데 상단
            drawPattern(pattern, row, col + newSize, newSize);
            // 오르쪽 상단
            drawPattern(pattern, row, col + newSize * 2, newSize);
            
            // 왼쪽 중간
            drawPattern(pattern, row + newSize, col, newSize);
            // 오른쪽 중간
            drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
            
            // 왼쪽 하단
            drawPattern(pattern, row + newSize * 2, col, newSize);
            // 가운데 하단
            drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
            // 오른쪽 하단
            drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
        }
    }
    
}

 

 

 

 

 

추가 하기

재귀 함수 확인을 위한 테스트 출력 코드 적용

 

N = 3 일때,

더보기

 - 결과

***
* *
***
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        printPattern(N);
    }

    public static void printPattern(int N) {
        // 패턴을 담을 Array 생성
        char[][] pattern = new char[N][N];
        // Array에 공백으로 모두 채워 초기화
        for (char[] row : pattern) {
            Arrays.fill(row, ' ');
        }
        
        // 패턴 메서드 실생
        drawPattern(pattern, 0, 0, N);
        
        // pattern 저장된 Array 출력
        for (char[] row : pattern) {
            System.out.println(row);
        }
    }

	// 패턴을 그리는 재귀적 메서드
    public static void drawPattern(char[][] pattern, int row, int col, int size) {
        if (size == 1) {
            // 재귀의 마지막단인 size가 1이면 "*"로 채움
            pattern[row][col] = '*';
        } else {
            // 재귀적으로 패턴 지정
            int newSize = size / 3;
            
            // 왼쪽 상단
            drawPattern(pattern, row, col, newSize);
            // 가운데 상단
            drawPattern(pattern, row, col + newSize, newSize);
            // 오르쪽 상단
            drawPattern(pattern, row, col + newSize * 2, newSize);
            
            // 왼쪽 중간
            drawPattern(pattern, row + newSize, col, newSize);
            // 오른쪽 중간
            drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
            
            // 왼쪽 하단
            drawPattern(pattern, row + newSize * 2, col, newSize);
            // 가운데 하단
            drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
            // 오른쪽 하단
            drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
        }
        
        for (char[] r : pattern) {
            System.out.println(r);
        }
        System.out.println();
        System.out.println("=".repeat(size));
        System.out.println();
    }
    
}



/*

// N = 3 일때



*  
   
   

=

** 
   
   

=

***
   
   

=

***
*  
   

=

***
* *
   

=

***
* *
*  

=

***
* *
** 

=

***
* *
***

=

***
* *
***

===

***
* *
***



*/

 

 

N = 9 일때,

더보기

 - 결과

*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        printPattern(N);
    }

    public static void printPattern(int N) {
        // 패턴을 담을 Array 생성
        char[][] pattern = new char[N][N];
        // Array에 공백으로 모두 채워 초기화
        for (char[] row : pattern) {
            Arrays.fill(row, ' ');
        }
        
        // 패턴 메서드 실생
        drawPattern(pattern, 0, 0, N);
        
        // pattern 저장된 Array 출력
        for (char[] row : pattern) {
            System.out.println(row);
        }
    }

	// 패턴을 그리는 재귀적 메서드
    public static void drawPattern(char[][] pattern, int row, int col, int size) {
        if (size == 1) {
            // 재귀의 마지막단인 size가 1이면 "*"로 채움
            pattern[row][col] = '*';
        } else {
            // 재귀적으로 패턴 지정
            int newSize = size / 3;
            
            // 왼쪽 상단
            drawPattern(pattern, row, col, newSize);
            // 가운데 상단
            drawPattern(pattern, row, col + newSize, newSize);
            // 오르쪽 상단
            drawPattern(pattern, row, col + newSize * 2, newSize);
            
            // 왼쪽 중간
            drawPattern(pattern, row + newSize, col, newSize);
            // 오른쪽 중간
            drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
            
            // 왼쪽 하단
            drawPattern(pattern, row + newSize * 2, col, newSize);
            // 가운데 하단
            drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
            // 오른쪽 하단
            drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
        }
        
        for (char[] r : pattern) {
            System.out.println(r);
        }
        System.out.println();
        System.out.println("=".repeat(size));
        System.out.println();
    }
    
}



/*

// N = 9 일때


*        
         
         
         
         
         
         
         
         

=

**       
         
         
         
         
         
         
         
         

=

***      
         
         
         
         
         
         
         
         

=

***      
*        
         
         
         
         
         
         
         

=

***      
* *      
         
         
         
         
         
         
         

=

***      
* *      
*        
         
         
         
         
         
         

=

***      
* *      
**       
         
         
         
         
         
         

=

***      
* *      
***      
         
         
         
         
         
         

=

***      
* *      
***      
         
         
         
         
         
         

===

****     
* *      
***      
         
         
         
         
         
         

=

*****    
* *      
***      
         
         
         
         
         
         

=

******   
* *      
***      
         
         
         
         
         
         

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

=

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

===

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

=========

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


*/