별 찍기 - 10
문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1
27
예제 출력 1
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
먼저 내가 처음 푼 방식.
받아온 크기 n만큼 이중배열 생성 후 ' * '로 채워주었다.
그리고 drawStar 함수를 이용했는데 4중 for문이 나왔다(...)
어쨌든.. 매개변수의 seq는 블럭의 크기를 나타낸다. 처음엔 n과 같은 크기로 시작해서 3이 될 때까지 seq/3을 넣어서 drawStar 다시 호출하도록 했다.
반복문을 보면 우선 안쪽의 j, i 반복문은 해당 블럭 크기안에서 공백( 공백은 seq / 3 크기임 )을 넣는다. 즉 n=27,seq=27 이면 27 사이즈의 블럭안에 27/3 즉 9*9 사이즈의 공백을 찍고, n=27, seq=9 이면 9 사이즈의 블럭 안쪽에 3*3 사이즈의 공백을 찍는다.
바깥쪽 z,k 반복문은 전체 크기의 블럭(n)에 해당 블럭 크기(seq)만큼 반복해서 공백을 찍도록 한다. 즉 n=27,seq=27 이면 27사이즈 블럭 안에 (27/3) 9*9 사이즈 공백을 한번만 찍고, n=27, seq=9 이면 9 사이즈의 블럭 안에 3*3 사이즈의 공백을 27사이즈 블럭 안에 9번 모두 찍도록 한다.
결과는 StringBuilder를 이용해 출력되도록 했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
char[][] stars = new char[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(stars[i], '*');
}
drawStar(n, stars, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(stars[i][j]);
}
sb.append("\n");
}
System.out.println(sb);
br.close();
}
public static void drawStar(int n, char[][] stars, int seq) {
for (int z = 0; z < n / seq; z++) {
for (int k = 0; k < n / seq; k++) {
for (int j = seq / 3 + z * seq; j < seq / 3 + z * seq + seq / 3; j++) {
for (int i = seq / 3 + k * seq; i < seq / 3 + k * seq + seq / 3; i++) {
stars[j][i] = ' ';
}
}
}
}
if (seq > 3) {
drawStar(n, stars, seq / 3);
}
}
}
다음으로 다른 분들 코드를 참조해서 풀어볼랬는데 코드만 보니까 어떻게 푸신건지 잘 이해가 안가서 구글링했는데
이 분이 되게 잘 설명해 놓으셨다!!!!
이해하기 쉽도록 중간에 출력문을 찍어놓았다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static char[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new char[N][N];
star(0, 0, N, false);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(arr[i][j]);
}
sb.append('\n');
}
System.out.print(sb);
}
static void star(int x, int y, int N, boolean blank) {
// 공백칸일 경우
if (blank) {
System.out.println("공백칸임 --1");
for (int i = x; i < x + N; i++) {
for (int j = y; j < y + N; j++) {
arr[i][j] = ' ';
System.out.println("arr["+i+"]["+j+"] = ' '");
}
}
System.out.println("공백칸끝 --1");
return;
}
// 더이상 쪼갤 수 없는 블록일 때
if (N == 1) {
arr[x][y] = '*';
return;
}
/*
N=27 일 경우 한 블록의 사이즈는 9이고,
N=9 일 경우 한 블록의 사이즈는 3이듯
해당 블록의 한 칸을 담을 변수를 의미 size
count는 별 출력 누적을 의미
*/
int size = N / 3;
int count = 0;
for (int i = x; i < x + N; i += size) {
for (int j = y; j < y + N; j += size) {
count++;
if (count == 5) { // 공백 칸일 경우
System.out.println("star("+i+", "+j+", "+size+", true) 호출 start");
star(i, j, size, true);
System.out.println("star("+i+", "+j+", "+size+", true) 호출 end");
} else {
System.out.println("star("+i+", "+j+", "+size+", false) 호출 start");
star(i, j, size, false);
System.out.println("star("+i+", "+j+", "+size+", false) 호출 end");
}
}
}
}
}
'6. 자료구조 & 알고리즘 > 6-2. 백준' 카테고리의 다른 글
백준 - [1018번: 체스판 다시 칠하기] (0) | 2022.06.27 |
---|---|
백준 - [2793번: 블랙잭] (0) | 2022.06.23 |
백준 - [4948번: 베르트랑 공준] (0) | 2022.06.19 |
백준 - [1929번: 소수 구하기] (0) | 2022.06.19 |
백준 - [11653번: 소인수분해] (0) | 2022.06.19 |