백준 10994번 별찍기 - 19(Java, 구현, Silver 4)

전승재·2024년 2월 21일
0

알고리즘

목록 보기
78/88

백준 10994번 별 찍기 - 19 문제 바로가기

코테를 자바로도 연습해보고 싶어서 자바로 풀어봤다!

문제 접근

예제의 입력과 출력을 보고 규칙을 찾아내야 하는 문제였다.
1을 입력했을 때 2차원 배열의 크기는 1이고
2 -> 5
3 -> 9
4 -> 13
이었다. 여기서 우리는 규칙을 찾아낼 수 있다.
4*(n-1) + 1의 2차원 배열이 생성되고 테두리에 *이 찍히는 구조이다.
따라서 재귀로 4 -> 3 -> 2 -> 1순으로 그려주면 된다.
따라서 그리는 메서드를 정의해서 자기 호출을 통해서 배열에 *를 그려줬다.
총 4*(n-1) + 1개의 *를 찍어주면 되고 별의 시작 위치는 재귀를 거듭함에 따라 2씩 증가한다. 이를 반영하여 drawStart 메서드를 작성했다.

문제 해결

drawStart 메서드

public static void drawStart(int start, char[][] array, int n) {
        if (n <= 0) {//종료 조건
            return;
        }
        int cnt = 4 * (n - 1) + 1;
        for (int i = start; i < start+4 * (n - 1) + 1; i++) {
            array[start][i] = '*';
            array[i][start] = '*';
            array[start+4 * (n - 1)][i] = '*';
            array[i][start+4 * (n - 1)] = '*';

        }
        drawStart(start+2, array, n-1);
    }

제출 코드

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

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        //1 5 9 13
        char[][] pan = new char[4 * (N - 1) + 1][4 * (N - 1) + 1];
        for (int i = 0; i < 4 * (N - 1) + 1; i++) {//빈칸으로 초기화
            for (int j = 0; j < 4 * (N - 1) + 1; j++) {
                pan[i][j] = ' ';
            }
        }
        drawStart(0, pan, N);//재귀함수 호출
        for (int i = 0; i < 4 * (N - 1) + 1; i++) {//출력단
            for (int j = 0; j < 4 * (N - 1) + 1; j++) {
                System.out.print(pan[i][j]);
            }
            System.out.println();
        }
    }

    public static void drawStart(int start, char[][] array, int n) {
        if (n <= 0) {//종료 조건
            return;
        }
        int cnt = 4 * (n - 1) + 1;
        for (int i = start; i < start+4 * (n - 1) + 1; i++) {
            array[start][i] = '*';
            array[i][start] = '*';
            array[start+4 * (n - 1)][i] = '*';
            array[i][start+4 * (n - 1)] = '*';

        }
        drawStart(start+2, array, n-1);
    }
}

0개의 댓글