문제 - 백준 문제 바로가기
재귀적인 패턴으로 별을 찍어 보자. 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]
Baekjoon Algorithm solve JAVA No.2447 별 찍기 - 10