알고리즘/백준
[백준] 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());
}
}