개발 블로그
article thumbnail

 

 

아이디어

출력을 보고 유추할 수 있는 것은 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
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!