풀이 방법
처음에 구현했을 때 로직은 맞았지만 시간초과가 떴다. 그 이유는 2중 for문으로 System.out.print()로 배열을 여러번에 걸쳐서 출력을 했기 때문이다. 그래서 한번에 출력하도록 하기 위해서 StringBuilder를 이용했다.
하지만 그 다음에는 틀렸습니다가 떴다. 그 이유는 백준에서는 null을 읽으면 발생한다고 한다. 그래서 char 2차원 배열을 ' ' 빈 공백으로 초기화 해주었다.
구현 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Q_2448 {
static char[][] array;
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
array = new char[N][N/3*6-1];
// 배열 초기화
for (int i = 0; i < N; i++) {
for (int j = 0; j < N/3*6-1; j++) {
array[i][j] = ' ';
}
}
int j_start = ((N/3)*6-1)/2; // 시작점
DrawStars(0, N-1, j_start);
// 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < N/3*6-1; j++) {
sb.append(array[i][j]);
}
sb.append("\n");
}
System.out.print(sb);
}
public static void DrawStars(int i_start, int i_end, int j) { // j는 삼각형 그리는 시작 위치
if (i_end - i_start == 2) { // 삼각형 그리기
array[i_start][j] = '*';
array[i_start+1][j-1] = '*';
array[i_start+1][j+1] = '*';
array[i_start+2][j-2] = '*';
array[i_start+2][j-1] = '*';
array[i_start+2][j] = '*';
array[i_start+2][j+1] = '*';
array[i_start+2][j+2] = '*';
return;
} else if (i_start < i_end) { // 3등분 나누기
int i_length = (i_end - i_start) / 2;
int j_length = (i_end - i_start +1) / 2;
DrawStars(i_start, i_start + i_length, j);
DrawStars(i_start + i_length + 1, i_end, j-j_length);
DrawStars(i_start + i_length + 1, i_end, j+j_length);
}
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[ Baekjoon ] 1753번 - 최단경로 (0) | 2021.02.04 |
---|---|
[ Baekjoon ] 1780번 - 종이의 개수 (0) | 2021.01.23 |
[ Baekjoon ] 1629번 - 곱셈 (0) | 2021.01.23 |
[ Baekjoon ] 1992번 - 쿼드트리 (0) | 2021.01.21 |
[ Baekjoon ] 1520번 - 내리막 길 (0) | 2021.01.18 |