본문 바로가기
알고리즘

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

by Kwoncorin 2020. 12. 27.
728x90

www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

1. 문제 설명

 

재귀적인 패턴으로 별을 찍는 문제이다.

 

N이 3일 때 별의 모양은

 

***

* *

*** 다음과 같으며 별의 패턴은 공백으로 채워진 가운데의 (N/3) * (N/3) 정사각형이 있고 가장자리는 N/3의 패턴으로 둘러싼 형태이다.

 

따라서 N이 3이거나 N을 계속하여 3으로 나누어서 3이 된다면

 

위의 형태와 같은 형태로 배열을 채웠다.

 

다른 분들의 경우 base case가 1일 경우에 *을 채우는 식으로 하신 분들도 있었는데

 

 N이 가능한 최저가 3이라서 base case를 3으로 해도 무방하다고 생각했다.

 

N이 3이 아닐 경우 3으로 나누고 중앙을 제외한 가장자리들은 계속해서 작업을 수행할 수 있도록 재귀 호출했다.

 

이번 문제에서 시간 초과가 계속하여 뜬다면 입출력에 주의해서 보길 바란다.

 

아래의 코드같이 BufferedWriter를 쓰기 전에 System.out.println 함수를 사용했는데 이 부분을 바꾸고 나서 시간 초과가 해결되었다.

 

2. 코드

 

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static char[][] box;

    public static void main(String[] args) throws IOException {
        Scanner scan=new Scanner(System.in);


        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int num=scan.nextInt();

        box=new char[num][num];

        for(int x=0;x<num;x++){
            for(int y=0;y<num;y++)
                box[x][y]=' ';
        }

        box_make(num,0,0);

        for (int i = 0; i < num; i++) {
            bw.write(box[i]);
            bw.write("\n");
        }
        bw.flush();
        bw.close();

        scan.close();
    }

    public static void box_make(int num,int x_index,int y_index){

        // num==3이면 base case
        if(num==3){
            for(int x=x_index;x<x_index+3;x++){
                for(int y=y_index;y<y_index+3;y++){
                    if(x!=x_index+1 || y!=y_index+1)
                        box[x][y]='*';
                }
            }

        }
        else{

            int blank=num/3;

            for(int x=x_index;x<x_index+num;x+=blank){
                for(int y=y_index;y<y_index+num;y+=blank){
                    //공백
                    if(x!=x_index+blank || y!=y_index+blank)
                        box_make(blank,x,y);
                }
            }


        }
    }

}
728x90