[백준] 2448번 : 별 찍기 - 11 (JAVA)

인간몽쉘김통통·2024년 1월 14일

백준

목록 보기
50/92

문제


이해

N은 3x2k 수이며 k는 10보다 작거나 같은 정수이다.

N이 입력됐을 때 다음과 같은 별을 출력하라.

접근

별 찍기 문제는 대부분 재귀를 통해 풀이하여야 한다.

출력된 별의 규칙을 파악해보자.

표시된 삼각형은 각각 N=3, 6, 12 일 때의 출력 모양이다. 물론 24일때는 전체 그림에 해당된다.

N=3인 삼각형은 가운데가 빈 기본 삼각형 형태를 띈다.

N=6인 삼각형인 기본 삼각형인 N=3 삼각형이 상, 좌, 우 꼭짓점에 붙은 것 처럼 표현된다.

N=12인 삼각형인 N=6인 삼각형이 마찬가지로 상, 좌, 우 꼭짓점에 붙은 것 처럼 표현된다.

이를 통해 재귀적으로 큰 삼각형부터 시작하여 내려가며 기본 삼각형을 기준으로 그리도록 하면 전체 삼각형을 그릴 수 있다.

따라서, 위와 같이 재귀적으로 처리하며 N=3인 기본 삼각형을 그려야 할 때만 해당 위치에 그려주면 전체 삼각형을 그릴 수 있다.

코드

package java_baekjoon;

import java.util.*;
import java.io.*;

public class prob2448 {
  static int N;
  static char[][] stars;

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    N = Integer.parseInt(br.readLine());

    stars = new char[N][2 * N - 1];
    for (int i = 0; i < N; i++) {
      Arrays.fill(stars[i], ' ');
    }

    draw_star(0, N - 1, N);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < 2 * N - 1; j++) {
        sb.append(stars[i][j]);
      }
      sb.append('\n');
    }

    System.out.println(sb.toString());
  }

  static void draw_star(int row, int col, int N) {
    if (N == 3) {
      stars[row][col] = '*';
      stars[row + 1][col - 1] = stars[row + 1][col + 1] = '*';
      stars[row + 2][col - 2] = stars[row + 2][col
          - 1] = stars[row + 2][col] = stars[row + 2][col + 1] = stars[row + 2][col + 2] = '*';
    } else {
      int bias = N / 2;
      draw_star(row, col, bias);
      draw_star(row + bias, col - bias, bias);
      draw_star(row + bias, col + bias, bias);
    }
  }
}

draw_star 함수를 보자. 파라미터로 행, 열, N 값을 받는다. N은 그려야 하는 삼각형의 크기이며 행, 열 값은 윗 꼭짓점이 찍히는 위치이다. (기준점을 의미)

N이 기본 삼각형을 의미하지 않으면 다음 하위 삼각형 3개를 그리도록 한다. 이 때, 하위 삼각형은 N / 2인 크기의 삼각형이 된다.

이렇게 재귀를 통해서 끝내 N=3인 삼각형을 그려야 한다면 받은 행, 열 위치에 기본 삼각형을 그린다.

결과

profile
SW 0년차 개발자입니다.

0개의 댓글