백준 - JAVA/재귀

[백준] 2447번 : 별 찍기 - 10 _ JAVA ( 주석 설명 )

wch_s 2023. 2. 14. 18:21

1번

→ 

어려웠다.

3*3 패턴을 만든 뒤 규칙에 따라 StringBuilder에 append 하려고 했는데,

개행 때문에 옆에 나란히 붙일 수는 없었다.

1시간동안 고민했지만, 해결 방법이 떠오르지 않아 아래 자료를 참고했다.

 

규칙(5번째 인덱스마다 공백이다.) 을 찾고

function(탐색 시작 행 : row, 탐색 시작 열 : column, 탐색할 범위 : N, 공백 판단 T/F : false) 을 만드는 문제이다.

재귀를 풀 때, 함수로 만들 규칙을 정확히 찾고 그 규칙을 구현하는 연습이 필요할 것 같다.

 


https://st-lab.tistory.com/95

 

[백준] 2447번 : 별 찍기 - 10 - JAVA [자바]

 

st-lab.tistory.com


 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static char[][] ary;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 출력을 위한 버퍼 활용
        int N = Integer.parseInt(br.readLine()); //3의 배수로, 패턴의 크기 N을 입력받는다.

        ary = new char[N][N]; //크기만큼의 2차원 배열을 생성한다.

        star(0,0,N,false); //시작은 0, 0 이다.

        StringBuilder sb = new StringBuilder(); //출력을 위한 StringBuilder를 생성한다.
        for(int i=0;i<N;++i){
            for(int j=0;j<N;++j){
                sb.append(ary[i][j]);
            }
            sb.append('\n');
        }

        System.out.println(sb); //크기 N의 패턴을 출력한다.
    }

    private static void star(int row, int column, int N, boolean blank) {
        //공백일 경우
        if(blank){
            //함수 입력 좌표에서부터 N*N까지 공백을 출력한다.
            for(int i=row;i<row+N;++i){
                for(int j=column;j<column+N;++j){
                    ary[i][j] = ' ';
                }
            }

            //함수 리턴을 종료하기 위해 return을 사용해주어야 한다.
            return;
        }

        //더 이상 쪼갤 수 없을 때 -> * 출력
        if(N==1){
            ary[row][column] = '*';

            //함수 리턴을 종료하기 위해 return을 사용해주어야 한다.
            return;
        }


        int size = N/3; //이 문제는 N/3 의 정사각형으로 감싸주기에 범위의 규칙을 사용한다.
        int count = 0; //항상 5번째에 공백이 생기므로, 그 카운팅을 세야 한다.

        for(int i=row;i<row+N;i+=size){
            for(int j=column;j<column+N;j+=size){
                count++;

                if(count==5){ //해당 시작 꼭짓점을 중심으로 N/3만큼의 공백을 생성한다.
                    star(i,j,size,true);
                }

                else{ //해당 시작 꼭짓점을 중심으로 N/3만큼의 *을 생성한다.
                    star(i,j,size,false);
                }
            }
        }
    }
}