별 찍기(2447)

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

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

예제 입력

27

예제 출력

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

풀이

import java.util.*;
public class Main{
    public static char[][] arr;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        arr = new char[N][N];

        star(0, 0, N, false);

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                sb.append(arr[i][j]);
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }

    public static void star(int x, int y, int N, boolean b){
      //공백일경우
        if(b){
          //빈칸을 표현해줘야함
            for(int i=x; i<x+N; i++){
                for(int j=y; j<y+N; j++){
                    arr[i][j]=' ';
                }
            }
            return;
        }
      //더이상 쪼갤 수 없을 때
        if(N==1){
            arr[x][y]='*';
            return;
        }

      //한 블록의 사이즈를 확인
        int size = N/3;
        int count=0;
        for(int i=x; i<x+N; i+=size){
            for(int j=y; j<y+N; j+=size){
                count++;
                if(count == 5){
                    star(i, j, size, true);
                }else{
                    star(i, j, size, false);
                }
            }
        }
    }
}

백준

2번째시도

도움을 받아서 성공하긴했지만 별의 좌표를 사용해서 접근하는 방식은 비슷해서 금방 따라했다..

  • iter -> 이런 포문에 좀 익숙해져보쟈

  • 2차원 배열에서 Arrays.fill을 사용하기 위해서는 한꺼번에 불가능하고 원래 2번의 For문을 거치지만 한번의 for문 안에 넣어서 사용하면 사용할 수 있다.

  • Scanner를 쓰니까 시간초과네?

    • Scanner로 값 입력받는거

      • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      • br.readLine()으로 입력받는데 -> 원하는 형으로 형변환을 해줘야한다

    • System.out.println으로 값 출력하는거

      • BufferdWriter bw = new BufferedWriter(new OutputStreamReader(System.out));

      • bw.write으로 입력

      • bw.flush()로 출력

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
        int n = Integer.parseInt(br.readLine());
        String[][] arr = new String[n][n];
        for (int i = 0; i < arr.length; i++) {
            Arrays.fill(arr[i], " ");
        }
        myPrint(arr, 0, 0, n);

        for (String[] strings : arr) {
            for (String s : strings) {
//                System.out.print(s+"");
                bw.write(s+"");
            }
//            System.out.print("\n");
            bw.write("\n");
        }
        bw.flush();
        br.close();
    }

    public static void myPrint(String[][] arr, int x, int y, int n){

        if(n==1){
            arr[x][y] = "*";
            return;
        }


        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                if(!(i==1 && j==1))
                    myPrint(arr, x+i*(n/3), y+j*(n/3), n/3);
            }
        }

    }

}

Last updated

Was this helpful?