728x90
문제
숫자 n이 주어졌을 때 패턴에 맞게 정사각형 모양의 별을 출력하라
n = 3의 k제곱 (1 ≤ k < 8)
접근 방식
정말 오래 걸려서 푼 문제다... 밤하늘의 별이 더 이상 이뻐 보이지 않는...
어쨌든 문제에 대해 설명을 해보겠다.
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
27이라는 입력이 주어졌을 때, 위와 같은 형태의 출력을 해야 하는데
규칙을 찾는 것 자체는 쉽다. (코드를 못 짤뿐...)
// 3일 때
***
* *
***
// 9일 때
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
우선 3일 때를 살펴보면 총 9개의 별과 공백으로 이루어진 문자열을 출력하는데
이때 가운데만 공백으로 유지한다.
9일 때도 마찬가지로 9번의 3일 때의 패턴과 공백 패턴을 포함한 출력을 하고
이 때도 가운데만 공백으로 유지한다.
여기서 항상 9번의 반복을 하고 가운데만 공백을 유지한다는 것이 중요한데
9번의 반복문을 돌면서 5번째 반복만 공백만 출력하도록 해주면 된다.
이전에 재귀를 연습하며 풀었던 문제와 같은 방식으로
가로, 세로의 길이는 항상 3의 거듭제곱이기 때문에
매 재귀 호출마다 사이즈를 3으로 나누면서 구역별로 별과 공백을 찍어주면 된다.
이 때 기존 문제들과 조금 다른 점은 9번의 반복 중 5번 째는
나머지 8번의 반복과 다른 동작을 수행해야 하기 때문에
파라미터로 다른 것을 넘겨줘야 한다는 것이다.
풀이
public class Main {
private static char[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
arr = new char[n][n];
createStar(0, 0, n, false);
for (char[] a : arr){
bw.write(a);
bw.write("\n");
}
bw.flush();
bw.close();
}
private static void createStar(int x, int y, int size, boolean jump) {
if (jump) {
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
arr[i][j] = ' ';
}
}
return;
}
if (size == 1) {
arr[x][y] = '*';
return;
}
int newSize = size / 3;
for (int i = x; i < size + x; i += newSize) {
for (int j = y; j < size + y; j += newSize){
if (i == (x + newSize) && j == (y + newSize)) {
createStar(i, j, newSize, true);
} else {
createStar(i, j, newSize, false);
}
}
}
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 15651번 : N과 M (3) (0) | 2023.10.28 |
---|---|
[백준] 2448번 : 별 찍기 - 11 (0) | 2023.10.27 |
[백준] 1992번 : 쿼드트리 (0) | 2023.10.26 |
[백준] 2630번 : 색종이 만들기 (0) | 2023.10.25 |
[백준] 1780번 : 종이의 개수 (0) | 2023.10.25 |