별 찍기 - 11 (백준, JAVA)

이 글의 목차3개
  1. ❌ 기존 풀이
  2. 💡 풀이 아이디어
  3. 💻 소스 코드

https://www.acmicpc.net/problem/2448

재귀 함수 이용 별 찍기 문제이다.

❌ 기존 풀이

작은 삼각형을 하나 출력하는 함수를 만들고, 삼각형이 출력되지 않는 위치의 패턴을 찾으려고 했다.

그림과 같이 각 삼각형의 위치를 숫자로 카운팅하며 5, 12, 13, 14 등 삼각형이 등장하지 않는 카운트에 패턴이 있을 것이라고 생각했지만 재귀를 이용해야 했다.

💡 풀이 아이디어

재귀는 항상 가장 큰 곳부터 가장 작은 곳 (조건이 성립되는 지점)까지 실행되야 하기 때문에 패턴을 먼저 파악해야한다.

패턴은 삼각형이 3개 반복된다는 것이다.

(위 삼각형, 왼쪽 아래 삼각형, 오른쪽 아래 삼각형)

이를 이용해서 삼각형의 크기를 절반으로 줄여가며 재귀를 수행할 수 있다.

(크기가 3이 될 시, print를 수행한다.)

또한, 왼쪽 아래, 오른쪽 아래 삼각형을 그릴 때 위 삼각형의 좌표를 기준으로 그려야 하기 때문에 String 2차원 배열을 선언하여 값을 할당한다. (빈 공간은 공백 (“ “))

초기 삼각형의 크기가 24일 때,

삼각형의 크기가 12인 삼각형 3개 (하늘색)

- 재귀 (크기 /= 2)

삼각형의 크기가 6인 삼각형 3개 (주황색)

- 재귀 (크기 /= 2)

삼각형의 크기가 3인 삼각형 3개 (빨간색)

- 조건 충족 (크기 == 3)

-> 삼각형 프린팅

💻 소스 코드

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

public class Main {
    static int answer = Integer.MAX_VALUE;
    
    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 input = Integer.parseInt(br.readLine());
        String[][] map = new String[input][2 * input - 1];

        for (int i = 0; i < map.length; i++) Arrays.fill(map[i], " ");
        
        star(input, 0, input - 1, map);

        // BufferedWriter를 이용하여 출력
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                bw.write(map[i][j]);
            }
            bw.newLine(); // 줄 바꿈
        }
        
        bw.flush(); // 버퍼 비우기
        bw.close(); // BufferedWriter 닫기
    }

    private static void star(int length, int y, int x, String[][] map) {
        if (length == 3) {
            map[y][x] = "*";
            map[y + 1][x - 1] = "*";
            map[y + 1][x + 1] = "*";
            map[y + 2][x - 2] = "*";
            map[y + 2][x - 1] = "*";
            map[y + 2][x] = "*";
            map[y + 2][x + 1] = "*";
            map[y + 2][x + 2] = "*";
            return;
        }

        int half = length / 2;
        star(half, y, x, map);
        star(half, y + half, x - half, map);
        star(half, y + half, x + half, map);
    }
}
전체 글 보기