본문 바로가기

개발(합니다)/알고리즘&코테

알고리즘 단계별로 풀어보기 : BOJ-2448(별찍기 [11])

반응형

문제(출처)

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.


입력

첫째 줄에 N이 주어진다. N은 항상 3X2^k 수이다. (3, 6, 12, 24, 48, ...) (k ≤ 10)


출력

첫째 줄부터 N번째 줄까지 별을 출력한다.


예제 입력

24


예제 출력

                       *                        

                      * *                       

                     *****                      

                    *     *                     

                   * *   * *                    

                  ***** *****                   

                 *           *                  

                * *         * *                 

               *****       *****                

              *     *     *     *               

             * *   * *   * *   * *              

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

           *                       *            

          * *                     * *           

         *****                   *****          

        *     *                 *     *         

       * *   * *               * *   * *        

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

     *           *           *           *      

    * *         * *         * *         * *     

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

  *     *     *     *     *     *     *     *   

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

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


내 풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

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

        try {
            int n = Integer.parseInt(br.readLine());
            int len = (n*2)-1;
//          0 1 2
//          0 1 2 3 4
            arr = new String[n][len];
            arr = initArr(arr);
            star(n, (len/2), 0);
            printCall(arr);
            bw.flush();
            bw.close();
            
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void star(int n, int x, int y) {
        if(n == 3) {
            arr[y][x] = "*";
            arr[y+1][x-1] = "*";
            arr[y+1][x+1] = "*";
            arr[y+2][x] = "*";
            arr[y+2][x+1] = "*";
            arr[y+2][x+2] = "*";
            arr[y+2][x-2] = "*";
            arr[y+2][x-1] = "*";
            return ;
        }
        star(n/2, x, y);
        star(n/2, x - (n/2), y + (n/2));
        star(n/2, x + (n/2), y + (n/2));
    }
    
    private static void printCall(String[][] arr) throws IOException {
        for(String[] i : arr ) {
            for(String j : i) {
                bw.write(j);
            }
            bw.newLine();
        }
    }
    private static String[][] initArr(String[][] arr) {
        for(int i = 0 ; i < arr.length;i++) {
            for(int j =0; j < arr[i].length; j++) {
                arr[i][j] = " ";
            }
        }
        return arr;
    }
}


내 풀이 해석

이중 배열로 첫 번째 삼각형을 하드 코딩한다.
첫 번째 삼각형의 가장 위에 삼각형을 기준하여 (0, 0) 이런식으로 좌표를 잡는다. 
기준 좌표를 기준으로 아래 왼쪽 삼각형을 그리는 재귀 함수를 작성한다.
기준 좌표를 기준으로 아래 오른쪽 삼각형을 그리는 재귀 함수를 작성한다.

아쉬운 점

문제에서 별을 찍는 규칙을 찾으려고 하다가 시간을 다 보내고 다른 방법을 찾아보았다.
규칙을 찾은 방법이 있나 해서 검색 해봤는데 찾은 정답들은 별을 하드 코딩해서 넣어서 풀은 정답이었다.
문제를 푸는데 집중해야 하는데 수학적으로 풀려고 해서 시간을 보냈다.
오후를 다 보내고서야 문제를 풀었다.
다음부터는 모르는 문제는 1시간을 넘기지 않고 찾아봐야겠다.

학습/검색


반응형