ALGORITHM

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

연듀 2022. 9. 6. 20:25

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

그림판으로 그려서 패턴을 분석해보았다. 

빨간색 박스는 n이 3일 경우,

주황색 박스는 n이 9일 경우(공백으로 채워진 3x3 정사각형을 3의 패턴으로 둘러싼 형태),

노란색 박스는 n이 27일 경우이다(공백으로 채워진 9x9 정사각형을 9의 패턴으로 둘러싼 형태)

 

 

 

 

이 때 빈칸의 규칙을 찾아보면, 

 

 

n이 3일 경우

가운데 비어있는 부분의 좌표는 (1,1) 부터 시작해 

1번째 줄을 보면 (1,1) (1,4) (1,7), (1,10) ... 부분이 비어있어 이 때의 규칙을 만족시키기 위한 조건은

i%3 == 1 && j&3 == 1 이란걸 알 수 있다. 

 

n이 9일 경우

가운데 비어있는 부분의 좌표는 (3,3) (3,4) (3,5) (4,3) (4,4) (4,5) (5,3) (5,4) (5,5) 이다.

이 때의 조건은 ( i / 3 ) % 3 == 1 && ( j / 3 ) % 3 == 1 이다.

 

 

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

public class Main{
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        for(int i=0; i<n; i++){ // 정사각형 탐색
            for(int j=0; j<n; j++){
                star(i,j,n);
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }
    public static void star(int i, int j, int n){
         if((i/n) % 3 == 1 && (j/n) % 3 == 1){ // 조건에 맞으면 빈칸
           sb.append(' ');
        }
        else{ // 빈칸이 아니라면
            if(n==1) sb.append('*'); // 3으로 더이상 나눠지지 않는 1이 되었을 때 * 출력
            else star(i, j, n/3); // 정사각형 사이즈를 3으로 나눠가면서 검사
        }
    }

}

 

 

정사각형 사이즈를 3으로 계속 나누면서 위에서 구한 조건을 적용해 n이 3과 1이 되었을 때 조건을 만족시키면 빈칸이다.

재귀호출을 통해 정사각형의 크기를 계속 나누며 검사하는게 포인트다.

재귀는 참 어려운거 같다..