728x90

문제

숫자 n이 주어졌을 때, 정해진 규칙에 맞게 별을 출력하라

 

접근 방식

별 찍기 10을 풀면 11을 쉽게 풀 수 있다길래 바로 도전했는데

어김없이 두들겨 맞았다...

 

별 찍기 문제들이 다 숫자 하나만 주고 알아서 규칙을 찾아서

규칙대로 출력하라니 정말 골 때리는 문제인 거 같다

(재귀 자체도 어려워 죽겠는데 팍C...)

 

그래도 이 문제까지 풀고 나니 재귀는 그냥 컴퓨터한테

믿고 맡기라는 말이 무슨 말인지 이해가 되는 거 같다

 

  *
 * *
*****

 

우선 n이 3인 경우를 살펴보면 알 수 있는 것들이 몇 가지 있다.

  1. 별은 총 3개의 층으로 규칙 없이 1, 2, 5개가 찍힌다.
  2. 가장 아래층은 2n - 1의 길이를 가진다.
     *
    * *
   *****
  *     *
 * *   * *
***** *****

 

다음으로 6인 경우를 살펴보면 3인 경우가 3번 반복되어

위, 왼쪽 아래, 오른쪽 아래 방향으로 출력되는 것을 알 수 있다.

 

           *
          * *
         *****
        *     *
       * *   * *
      ***** *****
     *           *
    * *         * *
   *****       *****
  *     *     *     *
 * *   * *   * *   * *
***** ***** ***** *****

 

12인 경우도 마찬가지로 6인 경우가 3번 위, 왼쪽 아래, 오른쪽 아래 방향으로 출력된다.

 

누가 봐도 재귀로 풀 수 있는 문제인데 이게 눈과 머리로 규칙을

이해는 했지만 코드로 짜려니 머리가 터지는 줄 알았다.

 

결국은 길이를 절반씩 줄이면서 재귀를 반복하다

길이가 3인 경우에만 현재 지점에서 3층 짜리 별 패턴을 찍어주면 되고

재귀 호출은 위, 왼쪽 아래, 오른쪽 아래 방향으로 3번 호출해 주면 된다.

 

풀이

public class Main {

	private static char[][] stars;

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

		int n = Integer.parseInt(br.readLine());

		stars = new char[n][2*n-1];

		for (int i = 0; i < n; i++) {
			Arrays.fill(stars[i], ' ');
		}

		createStar(n, 0, n - 1);

		for (char[] star : stars) {
			bw.write(star);
			bw.write("\n");
		}

		bw.flush();
		bw.close();
	}

	private static void createStar(int size, int x, int y) {
		if (size == 3) {
			stars[x][y] = '*';

			stars[x + 1][y - 1] = '*';
			stars[x + 1][y + 1] = '*';

			for (int i = y - 2; i <= y + 2; i++) {
				stars[x + 2][i] = '*';
			}

			return;
		}

		int newSize = size / 2;

		createStar(newSize, x, y); // 위
		createStar(newSize, x + newSize, y - newSize); // 왼
		createStar(newSize, x + newSize, y + newSize); // 오
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 15652번 : N과 M (4)  (0) 2023.10.29
[백준] 15651번 : N과 M (3)  (0) 2023.10.28
[백준] 2447번 : 별 찍기 - 10  (0) 2023.10.27
[백준] 1992번 : 쿼드트리  (0) 2023.10.26
[백준] 2630번 : 색종이 만들기  (0) 2023.10.25

+ Recent posts