https://www.acmicpc.net/problem/2447
골드 4 수준의 재귀 문제이다.
문제를 보고 이해가 잘 안되었는데, 예제를 보고 바로 이해했다.
이게 머리로는 쉬웠는데 막상 하려니 잘 되지 않았다
앞에서 푼 Z 문제랑 비슷했던거 같다
https://velog.io/@sm_park00/%EB%B0%B1%EC%A4%80-1074%EB%B2%88-Z-JAVA
(완전히 비슷하지 않지만 비슷한 맥락이다)
처음에는 배열의 저장 없이 출력으로만 별찍기를 하려다가, 너무 복잡해져서 앞에서 푼 Z 문제를 떠올려서 2차원 배열에 값들을 저장하기로 하였다.
단순 배열에만 저장하여 이중 for문을 통해 값을 불러오는 방식은 시간초과를 일으켜 StringBuilder 를 이용하여야 했다.
가장 애를 먹었던 부분은 아무것도 출력하지 않는 가운데 부분은 원래는 재귀를 돌리지 않고 냅뒀는데, null 처리가 되는거 같았다. 그래서 StringBuilder 처리를 할때, null 이면 빈칸을 add 하도록 하였는데도 의도한 대로 안됐다. 이 부분은 차후에 알아봐야겠다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static char[][] star;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
star = new char[N][N];
pattern(0, 0, N, false);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(star[i][j]);
}
sb.append('\n');
}
System.out.print(sb);
}
private static void pattern(int y, int x, int size, boolean blank) {
if(blank){
for(int i=y; i<y+size; i++){
for(int j=x; j<x+size; j++){
star[i][j] = ' ';
}
}
return;
}
if(size == 1){
star[y][x] = '*';
return;
}
int newsize = size/3;
for (int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(i==1 && j==1){
pattern(y+newsize*i, x+newsize*j, newsize, true);
}else{
pattern(y+newsize*i, x+newsize*j, newsize, false);
}
}
}
}
}
요즘 재귀 문제를 많이 푸는 중인데, 자꾸 될듯 말듯해서 아직 공부를 더 해야될거 같다. 이번 별 찍기 문제는 데이터를 어떻게 처리해야할지까지 신경을 써야해서 좀 더 어려웠던거 같다.