ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 백준 2447 별찍기 10
    Programming/Algorithm 2021. 3. 9. 00:48

     

     

    문제

    크기 3의 패턴이 주어지고, 크기가 3이상일 때 가운데는 공백 나머지는 n/3 패턴으로 둘러싼 형태의 모양을 출력하는 문제이다.

     

     

    풀이

    공백이 되어야 하는 부분과 아닌 부분으로 분할해서 재귀하는 것이 풀이의 핵심이다.

    - n을 3으로 나누어 현재 영역을 9등분한다.

    - 이 때 가운데는 공백이라는 조건이 있으므로, 5번째 영역은 항상 공백이 되어야 한다.

    - n이 1이라면 별을 출력하고, 아니라면 나누어진 영역을 재탐색한다. 

     

     

    코드

    import java.io.*;
    
    public class Main {
        static char[][] map;
    
        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()); // 3,9,27,...
            map = new char[n][n];
    
            recursion(0, 0, n, false);
    
            for (int i = 0; i < n; i++) {
                bw.write(map[i]);
                bw.write("\n");
            }
            bw.close();
        }
    
        static void recursion(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++) {
                        map[i][j] = ' ';
                    }
                }
                return;
            }
            // 더이상 쪼갤 수 없는 블록일 때
            if (n == 1){
                map[x][y] = '*';
                return;
            }
    
    
            int nn = n / 3;
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (i == 1 && j == 1){
                        recursion(x + i * nn, y + j * nn, nn, true);                }
                    else{
                        recursion(x + i * nn, y + j * nn, nn, false);
                    }
                }
            }
        }
    }
    

     

     

    댓글

Designed by black7375.