[백준 알고리즘 문제풀이][JAVA][2447번] 별 찍기 - 10

문제 - 백준 문제 바로가기

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.



시간제한

1초



알고리즘 유형

  • 분할정복
  • 재귀


예제입력 1

27

예제출력 1

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




풀이 1


package com.dev.출력;

import java.io.*;

public class No2447_별찍기10 {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
    BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( System.out ) );
    int n = Integer.parseInt(br.readLine());    //N => 3의 제곱꼴 (3, 9, 27, ...) (N=3k, 1 ≤ k < 8)
    for(int x=0; x<n; x++){
      for(int y=0; y<n; y++){
        if(isStar(new int[]{x, y}, n)) bw.write("*");
        else bw.write(" ");
      }
      bw.write("\n");
    }
    bw.flush();
  }
  private static boolean isStar(int[] a, int n){
    boolean isStar = true;  //별 여부
    int xx = 0; //공백값이 될 기준 Index
    boolean n0 = true;
    boolean n1 = true;
    for(int d = 3; d <= n; d*=3){   //3의 제곱꼴 범위만큼 체크
      n0 = true;  //[0] 공백여부
      n1 = true;  //[1] 공백여부
      xx = d/3;
      for(int x = xx; x <xx+xx; x++){ //xx(공백기준Index 부터 크기만큼 공백 체크)
        if(a[0]%d==x) n0 = false;
        if(a[1]%d==x) n1 = false;
      }
      if(!n0 && !n1){
        isStar = false;break;
      }
    }
    return isStar;
  }

}



풀이 2


package com.dev.출력;

import java.io.*;

public class No2447_별찍기10_2 {

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

    int n = Integer.parseInt(br.readLine());   //항상 3의 제곱꼴  ex) 3. 9. 29....
    int[][] arr = new int[n][n];
    boolean star = true;
    for(int x=0; x <arr.length ; x++){
      for(int y=0; y <arr[x].length ; y++){
        star = true;
        for(int z=1; z <=n ; z*=3){
          if(((x/z)%3==1 && (y/z)%3==1)) {
            star = false;
            break;
          }
        }
        if(star) bw.write ("*");
        else bw.write (" ");
      }
      bw.write ("\n");
    }
    bw.flush();
  }

}


풀이 3


package com.dev.출력;

import java.io.*;

public class No2447_별찍기10_3 {

  public static void main(String[] args) {
    try{
      go();
    }catch (IOException e){e.printStackTrace();}
  }
  private static void go() throws IOException {
    BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
    BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( System.out ) );

    int N = Integer.parseInt(br.readLine());

    boolean isStar = true;
    for(int i=0; i<N; i++){
      for(int ii=0; ii<N; ii++){
        isStar = true;
        int temp=0;
        for(int iii=3; iii<=N; iii*=3){
          temp = iii/3;
          if(i%iii>=temp && i%iii<=temp+temp-1 && ii%iii>=temp &&ii%iii<=temp+temp-1) {
            isStar = false; break;
          }
        }
        if(isStar)bw.write("*");
        else bw.write(" ");
      }
      bw.write("\n");
    }

    bw.flush();
  }

}





GitHub 소스는 아래에서 확인 가능합니다.

[풀이1] [풀이2] [풀이3]




마지막 수정