https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
문제
재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.
첫 번째 시도
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
arr = new char[N][N];
star(0, 0, N, false);
for (int i = 0; i < N; i++) {
bw.write(arr[i]);
bw.write("\n");
}
bw.flush();
bw.close();
}
static void star(int x, int y, int N, boolean blank) {
// 공백칸일 경우
if (blank) {
for (int i = x; i < x + N; i++) {
for (int j = y; j < y + N; j++) {
arr[i][j] = ' ';
}
}
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) { // 공백 칸일 경우
star(i, j, size, true);
} else {
star(i, j, size, false);
}
}
}
}
}
해결 방법
답이 나오지 않아서 구글에 검색했다.
어려웠던 점 / 고쳐야할 점
큰 블록으로 1, 2, 3 / 4, 5, 6 / 7, 8, 9 중 5번 째에만 공백이 들어가면 되는 건 이해 했는데, 구현을 어떻게 해야 하는지 몰랐다. 그래서 참고한 코드를 보면, star 메소드에서 5번째에 해당하는 것을 알 수 있도록 한 매개변수 blank가 참이면 공백을 넣는다. 그리고 매개변수 N은 주어진 숫자를 호출할 때마다 3으로 나누고, N이 1이 되면 *을 넣는다. Star 메소드 가장 아래의 for 문은 1, 2, 3 / 4, 5, 6 / 7, 8, 9의 순서대로 진행해서, count가 5가 되면 blank가 참이 되도록 하고, 아니라면 false를 입력하여 공백을 넣는 코드가 실행되지 않도록 한다. Main 메소드에선 크기가 주어진 수 N 인 2차원 배열을 선언하고, star 메소드를 호출해서 * 또는 공백을 넣는다.
'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글
[Problem Solving/Java] 백준 2231번 - 분해합 (1) | 2024.01.08 |
---|---|
[Problem Solving/Java] 백준 2798번 - 블랙잭 (0) | 2024.01.08 |
[Problem Solving/Java] 백준 10870번 - 피보나치 수 5 (0) | 2024.01.05 |
[Problem Solving/Java] 백준 10872번 - 팩토리얼 (1) | 2024.01.05 |
[Problem Solving/Java] 백준 10757번 - 큰 수 A+B (0) | 2024.01.05 |