본문 바로가기

성장 일기/알고리즘

[재귀] 백준 java(자바) #2447 별 찍기 - 10

<문제>

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

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


<풀이과정>

^정답률이 51%나 되는데 처음부터 어떻게 풀어야할지 감이 오지 않아 인터넷 검색을 하여 참고하였다.^

 

입력 가능 최소값 3을 기준으로 다음과 같은 그림의 결과가 나온다.

* * *
*   *
* * *

그림을 9등분하여 볼 때, (1,1) 위치에 있는 칸이 빈칸임을 알 수 있다.

 

이를 이용하여 27을 입력했을 때의 출력 값에도 적용한다.

입력값 : 27 의 결과

위 그림도 9등분하여 볼때 (1,1) 위치에 있는 칸이 빈칸임을 알 수 있다. 

 

9등분한 하나의 부분을 확대해서 보면 다음과 같다.

9등분한 칸 중 하나

위 그림도 9등분하여 보면, (1,1) 위치에 있는 칸이 빈칸이다.

 

이를 배열로 바꿔 [1][1]에만 빈칸이 되도록 만들어주면 된다. 그리고 나눌 수 없을 때까지 나눠 *을 입력해주면 된다.


<오류와 해결>

처음에는 36 - star(n, x + i * n, y + j * n); 이 아닌 star(n,  i * n,  j * n);을 사용하였더니 결과가 다르게 나왔다.

star(n,  i * n,  j * n);를 사용할 경우,

만약 n=1,x=3, y=0이고 i = 1, j=0일 때, star(1, 4, 0)이 호출되어야 하는데 star(1,1,0)이 호출되어 

***

* *

***

만 출력되는 오류가 발생한다. 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Scanner;
 
public class Main {
    private static char star[][];
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int num = sc.nextInt();
        
        star = new char[num][num];
        
        star(num, 00);
        
        for(int i = 0; i < num; i++) {
            for(int j = 0; j < num; j++) {
                System.out.print(star[i][j]);
            }
            System.out.println();
        }
    }
    
    public static void star(int n, int x, int y) {
        if(n == 1) {
            star[x][y] = '*';
            return;
        }
        n /= 3;
        
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                if(i == 1 && j == 1) {
                    star[i][j] = ' ';
                }else {
                    star(n, x + i * n, y + j * n);
                }
            }
        }
    }
 
}
 
cs

 


<참고자료>
티스토리, "[백준]2447번: 별찍기-10", https://gaebal-goebal.tistory.com/37