[BOJ] 2447번 별찍기-10

개요

’ * ‘문자를 이용해 속이 버어있는 사격형을 찍는 문제

문제링크

코드

import java.io.*;

public class Baekjoon2447 {
    public static char[][] arr;
    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];
        //배열 공백으로 초기화
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
            arr[i][j] = ' ';
            }
        }
        
        star(n,0,0);
        
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                bw.write(arr[i][j]);
            }
            bw.write("\n");
        }
        bw.flush();
    }

    public static void star(int n, int row, int col) {
        if(n == 3) {
            arr[row][col] = '*';
            arr[row][col+1] = '*';
            arr[row][col+2] = '*';

            arr[row+1][col] = '*';
            arr[row+1][col+2] = '*';

            arr[row+2][col] = '*';
            arr[row+2][col+1] = '*';
            arr[row+2][col+2] = '*';
        }
        else {
            star(n/3,row,col);
            star(n/3,row,col+(n/3));
            star(n/3,row,col+2*(n/3));

            star(n/3,row+(n/3),col);
            star(n/3,row+(n/3),col+2*(n/3));
            
            star(n/3,row+2*(n/3),col);
            star(n/3,row+2*(n/3),col+(n/3));
            star(n/3,row+2*(n/3),col+2*(n/3));
        }
    }
}

해결 과정

일단 재귀로 파고들 최소단위를 정하는데 나는 3x3크기의 사각형을 최소단위로 정했다.

image

위 사진을 보면 사각형이 맨윗줄 3개 중간 2개 아래줄 3개로 이루어진다. 이걸 바탕으로 재귀함수를 짜면 다음과 같다. 사각형의 기준 좌표는 왼쪽 위이다.

public static void star(int n, int row, int col) {
        if(n == 3) {
            arr[row][col] = '*';
            arr[row][col+1] = '*';
            arr[row][col+2] = '*';

            arr[row+1][col] = '*';
            arr[row+1][col+2] = '*';

            arr[row+2][col] = '*';
            arr[row+2][col+1] = '*';
            arr[row+2][col+2] = '*';
        }
        else {
            star(n/3,row,col);
            star(n/3,row,col+(n/3));
            star(n/3,row,col+2*(n/3));

            star(n/3,row+(n/3),col);
            star(n/3,row+(n/3),col+2*(n/3));
            
            star(n/3,row+2*(n/3),col);
            star(n/3,row+2*(n/3),col+(n/3));
            star(n/3,row+2*(n/3),col+2*(n/3));
        }
    }

결과

image

댓글남기기