문제설명
재귀적인 패턴으로 별을 찍어 보자. 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.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
static char[][] arr;
static int N;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
arr = new char[N][N];
star(N, 0, 0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(arr[i][j] != ' ' ? '*' : ' ');
}
sb.append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static void star(int n, int startR, int startC) {
if (n == 1)
return;
for (int i = startR; i < startR + n; i++) {
for (int j = startC; j < startC + n; j++) {
if (i >= startR+ n / 3 && i < startR+n / 3 * 2 && j >= startC+ n / 3 && j < startC+ n / 3 * 2) {
arr[i][j] = ' ';
}
}
}
if (startR + n == N && startC + n == N) {
star(n / 3, 0, 0);
return;
} else if (startC + n == N) {
star(n, startR+n, 0);
return;
} else {
star(n, startR, startC+n);
return;
}
}
}
문제 바로가기
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 1806번 부분합 for JAVA - 인덱스 이동 (0) | 2022.01.10 |
---|---|
[백준] 1764번 듣보잡 for JAVA - HashSet 이용 (0) | 2022.01.07 |
[백준] 2011번 암호코드 for JAVA (0) | 2022.01.07 |
[백준] 1992번 쿼드트리 for JAVA 분할정복을 이용한 풀이 (0) | 2022.01.05 |
[백준] 11729번 하노이 탑 이동 순서 for JAVA (0) | 2022.01.01 |