별찍기-11

09 June 2019

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

이번은 반복되는 모양을 출력하는 문제를 풀어보도록 하겠습니다.

import java.io.*;

public class Main {

    private static String[][] value = {
            {" ", " ", "*", " ", " "},
            {" ", "*", " ", "*", " "},
            {"*", "*", "*", "*", "*"}
    };

    public static void main(String args[]) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        int input = Integer.parseInt(reader.readLine()) / 3;

        int num = 0;

        while (input != 1) {
            input = input / 2;
            num++;
        }

        String[][] ret = value;
        for (int i = 0; i < num; i++) {
            ret = getNextValue(ret);
        }

        for (int i = 0; i < ret.length; i++) {
            for (int k = 0; k < ret[i].length; k++) {
                writer.write(ret[i][k]);
            }
            writer.write("\n");
        }

        writer.flush();
        writer.close();
        reader.close();
    }


    private static String[][] getNextValue(String[][] value) {

        int height = value.length;
        int width = value[0].length;

        String[][] ret = new String[height * 2][width * 2 + 1];

        for (int i = 0; i < ret.length; i++) {
            for (int k = 0; k < ret[i].length; k++) {
                ret[i][k] = " ";
            }
        }

        for (int i = 0; i < value.length; i++) {
            for (int k = 0; k < value[i].length; k++) {
                ret[i][1 + k + value[i].length / 2] = value[i][k];
                ret[i + value.length][k] = value[i][k];
                ret[i + value.length][1 + k + value[i].length] = value[i][k];
            }
        }
        return ret;
    }
}
input이 3*2^x로 x의 값이 변하는 것에 따라 최초의 값에서 3배로 모양이 커지는 규칙을 발견할 수 있습니다.

- x = 0 인 경우

  *                       
 * *                      
***** 
- x = 1 인 경우

     *     
    * *    
   *****   
  *     *  
 * *   * * 
***** *****
입력으로 2차원 배열을 받아 위와 같이 3배의 모양이 되는 배열을 만들어주는 getNextValue method를 작성합니다.
들어온 x의 값만큼 getNextValue 함수로 받은 return값을 저장하고, 다시 input으로 넣어서 반복해줍니다.
제한시간이 1초이므로 속도 향상을 위해서 BufferedWriter를 이용해, 마지막으로 받은 값을 출력해주도록 합니다.