본문 바로가기

백준

백준 10994 별찍기 - 19 (JAVA)

문제

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

 

10994번: 별 찍기 - 19

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

www.acmicpc.net

코드

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(bf.readLine());
        char[][] star = print_star(n);
        //별리 그려져 있는 사각형 한변의 길이
        int size = (n-1)*4+1;

        //출력
        for(int i=0;i<size;i++) {
            for(int j=0;j<size;j++) {
                sb.append(star[i][j]);
            }sb.append("\\n");
        }
        System.out.println(sb.toString());

    }

    //재귀적으로 문제 해결
    public static char[][] print_star(int num){
        //인자인 num에 따른 별이 그려져 있는 사각형 한변의 길이
        int size = (num-1)*4+1;
        char[][] star = new char[size][size];

        //공백으로 초기화
        for(int i=0;i<size;i++) {
            Arrays.fill(star[i], ' ');
        }

        //가장 중앙에 있는 칸에 별
        if(num==1) {
            star[0][0]='*';
            return star;
        }

        //해당 사이즈의 사각형 안에 있는 별 찍기
        char[][] pre_star = print_star(num-1);
        for(int i=0;i<size;i++) {
            for(int j=0;j<size;j++) {
                //최외곽에 별찍기
                if(i==0 || i==size-1 || j==0 || j==size-1) {
                    star[i][j]='*';
                }
                //내부에 있는 사각형에 대해서 별찍기, 최외곽과 그 다음 사각형에 사이에 있는 공백은 건너뜀
                else if(2<=i && i<size-2 && 2<=j && j<size-2) {
                    star[i][j]=pre_star[i-2][j-2];
                }
            }
        }
        return star;

    }
}

풀이

처음에는 어떠한 규칙을 찾고 조건문으로 해결하려 하였으나 코드가 너무 복잡해지고 한계가 있다고 생각이 들어 정답을 참고 하였다. 그 결과 재귀적으로 차근차근 해결하는 코드를 보았고 이를 직접 구현해보았다.

풀이 과정은 다음과 같다. 먼저 입력값을 기반으로 배열을 만든다. 그러고 해당 배열값에서 1을 빼주어서 다시 재귀적으로 반복해준다. 그러다 함수의 인자가 1이 되면 가장 작은 값이기에 바로 별을 찍어준다. 그리고 바로 해당 배열을 반환해준다. 그리고 그 다음부터는 반복문을 통해 진행해준다.

구현을 어느정도 풀고나면 분할정복에 대해서도 공부를 해야할것 같다.

'백준' 카테고리의 다른 글

백준 20291 파일 정리(JAVA)  (0) 2022.07.18
백준 20436 ZOAC 3 (JAVA)  (0) 2022.07.15
백준 12933 오리 (JAVA)  (0) 2022.07.14
백준 1913 달팽이 (JAVA)  (0) 2022.07.11
백준 4396 지뢰 찾기 (JAVA)  (0) 2022.07.08