728x90
1. 문제 설명
재귀적인 패턴으로 별을 찍는 문제이다.
N이 3일 때 별의 모양은
***
* *
*** 다음과 같으며 별의 패턴은 공백으로 채워진 가운데의 (N/3) * (N/3) 정사각형이 있고 가장자리는 N/3의 패턴으로 둘러싼 형태이다.
따라서 N이 3이거나 N을 계속하여 3으로 나누어서 3이 된다면
위의 형태와 같은 형태로 배열을 채웠다.
다른 분들의 경우 base case가 1일 경우에 *을 채우는 식으로 하신 분들도 있었는데
N이 가능한 최저가 3이라서 base case를 3으로 해도 무방하다고 생각했다.
N이 3이 아닐 경우 3으로 나누고 중앙을 제외한 가장자리들은 계속해서 작업을 수행할 수 있도록 재귀 호출했다.
이번 문제에서 시간 초과가 계속하여 뜬다면 입출력에 주의해서 보길 바란다.
아래의 코드같이 BufferedWriter를 쓰기 전에 System.out.println 함수를 사용했는데 이 부분을 바꾸고 나서 시간 초과가 해결되었다.
2. 코드
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static char[][] box;
public static void main(String[] args) throws IOException {
Scanner scan=new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num=scan.nextInt();
box=new char[num][num];
for(int x=0;x<num;x++){
for(int y=0;y<num;y++)
box[x][y]=' ';
}
box_make(num,0,0);
for (int i = 0; i < num; i++) {
bw.write(box[i]);
bw.write("\n");
}
bw.flush();
bw.close();
scan.close();
}
public static void box_make(int num,int x_index,int y_index){
// num==3이면 base case
if(num==3){
for(int x=x_index;x<x_index+3;x++){
for(int y=y_index;y<y_index+3;y++){
if(x!=x_index+1 || y!=y_index+1)
box[x][y]='*';
}
}
}
else{
int blank=num/3;
for(int x=x_index;x<x_index+num;x+=blank){
for(int y=y_index;y<y_index+num;y+=blank){
//공백
if(x!=x_index+blank || y!=y_index+blank)
box_make(blank,x,y);
}
}
}
}
}
728x90
'알고리즘' 카테고리의 다른 글
[JAVA]백준 1037번: 약수 (0) | 2020.12.27 |
---|---|
[JAVA]백준 11866번: 요세푸스 문제 0 (0) | 2020.12.27 |
[JAVA]백준 11653번: 소인수분해 (0) | 2020.12.23 |
[JAVA]백준 17829번: 222-풀링 (0) | 2020.11.29 |
[JAVA]백준 2630번: 색종이만들기 (0) | 2020.11.27 |