본문 바로가기

Java/백준

[JAVA] 백준 2447 별 찍기 - 10

2447번: 별 찍기 - 10 (acmicpc.net)

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

- N이 3의 거듭제곱이라고 할 때, 크기 N의 패턴은 N*N 정사각형 모양이다. 

- 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴 

 

 

- N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 개운데의 (N/3)*(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태 

 

 

풀이 과정 

[백준] 2447번 : 별 찍기 - 10 - JAVA [자바] (tistory.com)

 

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

 

st-lab.tistory.com

 

[Java] 백준 2447번 [별 찍기 - 10] 자바 (velog.io)

 

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

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

velog.io

 

- 3일때 모양이 연속적으로 채우면서 진행되는데, 단 한 block의 '가운데'는 채우지 않음

- 2차원 배열을 행을 x, 열을 y로 생각

 

- N=3일때 ,공백은 arr[1][1]

 -> 이 의미는 행을 채울 때, (0,0),(0,1),(0,2),(1,0)별을 출력하고 별 출력이 4번 이루어지면 그 다음은 반드시 공백이라는 것

 

- N=27일 때 9개의 블록으로 구분 가능 

- 공백인 구간을 만족한다면 그 구간은 공백으로 채우고, 공백이 아닌 블럭은 재귀호출을 하면 됨 

 

- N=9일 때로 넘어감 

- 앞선 함수와 같이 9개의 블록으로 나눈 뒤, 공백 구간은 공백 문자로 채우고 공백이 아닌 구간을 다시 재귀호출 

 

- N=3일 때로 넘어감 

- 위와 같은 과정을 반복하다 보면 결국 N=1일 떄가 옴

- 여기서는 더 이상 쪼갤 수 없기 때문에 해당 구역의 배열을 공백 또는 별(*)로 채움 

 

- if(count == 5) {의 조건은 n이 3일 때 별은 5번째에서 공통적으로 공백이 찍히게 됨 

- count 변수를 반복이 한 번 될 때까지 증가시켜서 5번째에 위치할 때 공백을 처리할 수 있도록 만듬 

 

 

정답 

 

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

public class Main 
{
    public static char[][] arr;
    
    static void makeStar(int x, int y, int n, boolean blank)
    {
        //공백 칸일 경우 
        if(blank)
        {
            for(int i=x; i<x+n; i++)
            {
                for(int j=y; j<y+n; j++)
                {
                    arr[i][j] = ' ';
                }
            }
            return;
        }
        
        //더 이상 쪼갤 수 없는 블록일 때 
        if(n==1)
        {
            arr[x][y] = '*';
            return;
        }
        
        int size = n/3;
        int count = 0; //별 출력 누적 
        
        for(int i=x; i<x+n; i+=size)
        {
            for(int j=y; j<y+n; j+=size)
            {
                count++;
                if(count == 5)
                {
                    //공백 칸일 경우 
                    makeStar(i,j,size,true);
                }
                else
                {
                    makeStar(i,j,size,false);
                }
            }
        }
    }
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        
        arr = new char[n][n];
        
        makeStar(0,0,n,false);
        
        for(int i=0; i<n;i++)
        {
            bw.write(arr[i]);
            bw.write("\n");
        }
        
        bw.flush();
        bw.close();
        
        
    }
}