아이디어
출력을 보고 유추할 수 있는 것은 N = 24 일 때의 별은 N = 12 일 때의 별을 3개 출력한 결과라는 것이다.
따라서 재귀함수를 활용하면 문제를 해결할 수 있을 것이라 생각했고 각 별이 출력되는 위치가 다르기 때문에
좌표와 별의 크기를 입력으로 받는 재귀함수를 만들면 된다고 생각했다.
해당 함수를 draw(int i, int j, int N) 이라고 가정하고 예제를 살펴보면
draw(0, 0, 24)
-> draw(0, 12, 12)
-> draw(12, 0, 12)
-> draw(12, 24, 12)
와 같이
N = 24 짜리 별을 위해서 (0, 12) 에서 시작해 N = 12 인 별, (12, 0) 에서 시작해 N = 12인 별, (12, 24) 에서 시작해 N = 12 인 별을 출력하면 된다.
이를 일반화 하면
draw(i, j, N)
-> draw(i, j + N / 2, N / 2)
-> draw(i + N / 2, j, N / 2)
-> draw(i + N / 2, j + N, N / 2)
다만 N = 3 일 때는 별을 더 작은 크기의 별로 쪼갤 수 없으므로 N = 3 일 때 재귀함수가 더 이상 자기 자신을 호출하지 않도록 해야 한다.
풀이코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static char[][] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
board = new char[N][2 * N - 1];
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2 * N - 1; j++) {
board[i][j] = ' ';
}
}
draw(0, 0, N);
StringBuilder result = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2 * N - 1; j++) {
result.append(board[i][j]);
}
result.append("\n");
}
System.out.println(result);
}
public static void draw(int i, int j, int N) {
if (N == 3) {
board[i][j + 2] = '*';
board[i + 1][j + 1] = board[i + 1][j + 3] = '*';
board[i + 2][j] = board[i + 2][j + 1] = board[i + 2][j + 2] = board[i + 2][j + 3] = board[i + 2][j + 4] = '*';
return;
}
draw(i, j + N / 2, N / 2);
draw(i + N / 2, j, N / 2);
draw(i + N / 2, j + N, N / 2);
}
}
'Algorithm > 백준 알고리즘' 카테고리의 다른 글
11054번. 가장 긴 바이토닉 부분 수열 (0) | 2024.01.09 |
---|---|
10830번. 행렬 제곱 (1) | 2024.01.09 |
1987번. 알파벳 (2) | 2024.01.05 |
1504번. 특정한 최단 경로 (2) | 2024.01.04 |
1043번. 거짓말 (0) | 2024.01.03 |