백준 2447 - 별 찍기 - 10

Updated:

Java

2447 번 - 별 찍기 - 10

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, …)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

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

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

접근 방법

분할 정복의 문제이다.
재귀적으로 별을 찍을 위치를 주어, 만약 크기가 1이면 현재 위치에 별을 찍었다.

예제의 27 X 27을 기준으로 예를 나타내면,


으로 [9x9]의 크기인 9개의 도형으로 나누어진다.
처음에 0,0과 size를 n으로 주어진다.
그리고 각 도형의 시작점은 n을 3으로 나눈 결과의 0, 1, 2배 씩이므로, 각 시작점을 계산해주어 재귀 함수의 인자로 계속 넘긴다.
각 size가 1이 되면, 그 위치는 별을 뜻하므로 별을 찍고 함수를 종료한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result;
	static char[][] star;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    	n = stoi(br.readLine());
    	star = new char[n][n];
		// 별의 크기 만큼 공백으로 초기화한다.
    	for(int i = 0; i < n; i++) {
    		for(int j = 0; j < n; j++) {
    			star[i][j] = ' ';
    		}
    	}
		// 별 찍기
    	GetStar(n,0,0);
		// 출력
    	StringBuilder sb = new StringBuilder();
    	for(int i = 0; i < n; i++) {
    		for(int j = 0; j < n; j++) {
    			sb.append(star[i][j]);
    		}
    		sb.append("\n");
    	}
    	System.out.println(sb);
    	br.close();
	}
	
	static void GetStar(int size, int y, int x) {
		if(size == 1) {
			star[y][x] = '*';
			return;
		}
		// 각 방향으로 찍을 위치를 준다. 제일 중간은 비어있으므로 CONTINUE로 넘긴다.  
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++) {
				if(i == 1 && j == 1)
					continue;
				GetStar(size/3, y + size / 3 * i, x + size / 3 * j);
			}
		}
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐⭐★★★

후기

초기 별 배열에서 공백으로 초기화를 해주지 않아 출력이 이상하게 나왔다.
IDE 결과 값은 제대로 나와 의문을 품게한 문제이다.

개선할 점