백준 10994번 별 찍기 - 19 문제 바로가기
코테를 자바로도 연습해보고 싶어서 자바로 풀어봤다!
예제의 입력과 출력을 보고 규칙을 찾아내야 하는 문제였다.
1을 입력했을 때 2차원 배열의 크기는 1이고
2 -> 5
3 -> 9
4 -> 13
이었다. 여기서 우리는 규칙을 찾아낼 수 있다.
4*(n-1) + 1의 2차원 배열이 생성되고 테두리에 *이 찍히는 구조이다.
따라서 재귀로 4 -> 3 -> 2 -> 1순으로 그려주면 된다.
따라서 그리는 메서드를 정의해서 자기 호출을 통해서 배열에 *를 그려줬다.
총 4*(n-1) + 1개의 *를 찍어주면 되고 별의 시작 위치는 재귀를 거듭함에 따라 2씩 증가한다. 이를 반영하여 drawStart 메서드를 작성했다.
public static void drawStart(int start, char[][] array, int n) {
if (n <= 0) {//종료 조건
return;
}
int cnt = 4 * (n - 1) + 1;
for (int i = start; i < start+4 * (n - 1) + 1; i++) {
array[start][i] = '*';
array[i][start] = '*';
array[start+4 * (n - 1)][i] = '*';
array[i][start+4 * (n - 1)] = '*';
}
drawStart(start+2, array, n-1);
}
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
//1 5 9 13
char[][] pan = new char[4 * (N - 1) + 1][4 * (N - 1) + 1];
for (int i = 0; i < 4 * (N - 1) + 1; i++) {//빈칸으로 초기화
for (int j = 0; j < 4 * (N - 1) + 1; j++) {
pan[i][j] = ' ';
}
}
drawStart(0, pan, N);//재귀함수 호출
for (int i = 0; i < 4 * (N - 1) + 1; i++) {//출력단
for (int j = 0; j < 4 * (N - 1) + 1; j++) {
System.out.print(pan[i][j]);
}
System.out.println();
}
}
public static void drawStart(int start, char[][] array, int n) {
if (n <= 0) {//종료 조건
return;
}
int cnt = 4 * (n - 1) + 1;
for (int i = start; i < start+4 * (n - 1) + 1; i++) {
array[start][i] = '*';
array[i][start] = '*';
array[start+4 * (n - 1)][i] = '*';
array[i][start+4 * (n - 1)] = '*';
}
drawStart(start+2, array, n-1);
}
}