반응형
https://www.acmicpc.net/problem/2447
문제를 이해하기 위해서 예제 출력을 분해해 봤다.
크기가 3(=3 ¹)일 때는 가운데 공백이 있고, 가운데를 제외한 모든 칸에 별이 있는 모양이다.
그리고 N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) ×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.
예를 들어, N = 3²=9일때, 가운데에 3*3의 공백이 있고 그 주위를 3의 패턴으로 둘러싼 형태이다.
마찬가지로 N=3³=27은 아래와 같이 그릴 수 있다.
이걸 사이즈를 줄여가면서 재귀해 주면 된다.
N*N배열을 선언주고 미리 공백으로 모두 채워주었다.
star(0,0, N)을 호출해서 가장 큰 모양을 시작으로 N==1이 아니면 계속해서 재귀호출을 하도록 해서 가장 작은 1의 단위로 만들어지게 했다.
3*3의 반복문안에서 i=1, j=1일 때는 무조건 공백이기 때문에 조건문으로 재귀 호출을 하지 않도록 해주고
이 외에는 각각 n/3의 크기로 사이즈를 나누어 주었다.
static void star(int x, int y, int n) {
if(n==1) {
arr[x][y]="*";
return;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(i == 1 && j == 1)) {
star( x + i * (n / 3), y + j * (n / 3), n / 3);
}
}
}
}//star()
x와 y 좌표에 각각 i*(n/3)을 더해준 이유는 나누어진 패턴의 시작 좌표가
N=27을 기준으로 (x,y,size) 일 때
(0,0,9) (0,9,9) (0,18,9)
(9,0,9) (9,9,9) (9,18,9)
(18,0,9) (18,9,9) (18,18,9)
이기 때문이다.
import java.io.*;
import java.util.*;
public class Main {
static int N;
static String[][] arr;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new String[N][N];
for(int i=0;i<N;i++)
Arrays.fill(arr[i]," ");
star(0,0,N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(arr[i][j]);
}
sb.append("\n");
}
System.out.println(sb);
}// main()
static void star(int x, int y, int n) {
if(n==1) {
arr[x][y]="*";
return;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(i == 1 && j == 1)) {
star( x + i * (n / 3), y + j * (n / 3), n / 3);
}
}
}
}//star()
}// class Main
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 1011 : Fly to the Alpha Centauri (0) | 2023.02.23 |
---|---|
[Java] 백준 12865 : 평범한 배낭 (0) | 2023.02.22 |
[Java] 백준 7576 : 토마토 (0) | 2023.02.21 |
[Java] 백준 1309 : 동물원 (0) | 2023.02.21 |
[Java] 백준 1946 : 신입 사원 (0) | 2023.02.20 |
댓글