알고리즘/백준

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

Junuuu 2022. 8. 1. 00:01
반응형

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

문제 해석

재귀함수를 활용하여 별을 찍는 문제 같습니다.

분할정복 느낌으로 사각형 크기가 3인 사각형을 확장해 나가는 것 같습니다.

 

문제 풀이 전 설계

재귀함수의 반복은 N=3일때까지 반복을 합니다. (가장 작은 단위가 N=3일때 )

만약 N=9가 들어오게 된다면 위 사각형 그리기, 가운데 공백있는 사각형 그리기, 아래 사각형 그리기로 나뉘어 재귀함수를 호출해야 할 것 같습니다.

 

재귀함수(){
	if(N==3){
		제일 작은 사각형 만들기
		return
	}

	위사각형()
	가운데사각형()
	아래사각형()
}

 

초반 설계와는 다르게 N==1일때만 별을 찍어주고, 가운데부분 공백은 i==1, j==1일때 넘어가는 방식을 통해서 빈칸은 제외시켜줬습니다.

 

코드

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

public class Main_2447_별찍기10 {

    static char[][] board;

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

        board = new char[N][N];
        for (int i = 0; i < N; i++) {
            Arrays.fill(board[i], ' ');
        }

        makeRect(N, 0, 0);

        printBoard(N);

    }

    public static void makeRect(int N, int y, int x) {
        if (N == 1) board[y][x] = '*';
        else {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (i == 1 && j == 1) ;
                    else makeRect(N / 3, y + N / 3 * i, x + N / 3 * j);
                }
            }
        }
    }

    private static void printBoard(int N) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(board[i][j]);
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}